Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

Текстовая информация в JPEG...   Найти похожие ветки 

 
Slawan ©   (2005-03-17 17:16) [0]

Всем привет!!!
Читаю описание формата файла JPEG. Там есть текстовый комментарий (COM). Его можно найти по заголовку $FF $FE. У меня более гигабайта обоев в формате JPEG, но ни в одном рисунке я не нашёл этого тэга. Windows же каким-то образом сохраняет туда текстовую информацию, которую я ввожу в свойства\сводка и там "Тема", "Название", "Комментарий" и т.д.
Вопрос: знает ли кто-нибудь функции API или хоть принцип, по которому виндовоз записывает эти данные в файл???
Заранее спасибо!!!


 
AlterEgo of WondeRu ©   (2005-03-17 23:59) [1]

эта информация называется EXIF... я в гугле находил инфу по работе с EXIF и Delphi


 
uny ©   (2005-03-18 11:29) [2]

только текстовый? всегда был любой.
есть прога, которая ищет такие коментарии и удаляет(фотошоп и т.д. насовывают всякий мусор)
предлагаю с ней поэксперементировать - посмотреть что именно удаляет. прога бесплатная и маленькая 275 кб
http://cmail.info.kuzbass.net/~pro/contents/soft/download/jc32_ru_043.zip


 
WondeRu ©   (2005-03-18 12:42) [3]

{==============================================================================
Component simple read Exif section in Jpeg/Jfif Files.
More information about Exif you can get at www.exif.org

Component writen by SimBa aka Dimoniusis

You may use this component absolutly free.

You may talk with me via
e-mail: dimonius@mailru.com
ICQ: 11152101

or

Web: http://dimonius.da.ru
==============================================================================}

unit Exif;

interface

uses
 Classes, SysUtils;

type
 TExif = class(TObject)
   private
     FImageDesc          : String;     //Picture description
     FMake               : String;     //Camera manufacturer
     FModel              : String;     //Camere model
     FOrientation        : Byte;       //Image orientation - 1 normal
     FOrientationDesk    : String;     //Image orientation description
     FCopyright          : String;     //Copyright
     FValid              : Boolean;    //Has valid Exif header
     FDateTime           : String;     //Date and Time of Change
     FDateTimeOriginal   : String;     //Original Date and Time
     FDateTimeDigitized  : String;     //Camshot Date and Time
     FUserComments       : String;     //User Comments

     f                   : File;
     idfp                : Cardinal;
     function ReadValue(const Offset, Count: Cardinal): String;
     procedure Init;
   public
     constructor Create;
     procedure ReadFromFile(const FileName: AnsiString);

     property ImageDesc: String read FImageDesc;
     property Make: String read FMake;
     property Model: String read FModel;
     property Orientation: Byte read FOrientation;
     property OrientationDesk: String read FOrientationDesk;
     property Copyright: String read FCopyright;
     property Valid: Boolean read FValid;
     property DateTime: String read FDateTime;
     property DateTimeOriginal: String read FDateTimeOriginal;
     property DateTimeDigitized: String read FDateTimeDigitized;
     property UserComments: String read FUserComments;
 end;

implementation

type
 TMarker = record
   Marker   : Word;      //Section marker
   Len      : Word;      //Length Section
   Indefin  : Array [0..4] of Char; //Indefiner - "Exif" 00, "JFIF" 00 and ets
   Pad      : Char;      //0x00
 end;

 TTag = record
   TagID   : Word;       //Tag number
   TagType : Word;       //Type tag
   Count   : Cardinal;   //tag length
   OffSet  : Cardinal;   //Offset / Value
 end;

 TIFDHeader = record
   pad          : Byte; //00h
   ByteOrder    : Word; //II (4D4D)
   i42          : Word; //2A00
   IFD0offSet   : Cardinal; //0th offset IFD
   Interoperabil: Byte;
 end;

function TExif.ReadValue(const Offset, Count: Cardinal): String;
var fp: LongInt;
    i: Word;
begin
 SetLength(Result,Count);
 fp:=FilePos(f); //Save file offset
 Seek(f, Offset);
 try
   i:=1;
   repeat
     BlockRead(f,Result[i],1);
     inc(i);
   until (i>=Count) or (Result[i-1]=#0);
   if i<=Count then Result:=Copy(Result,1,i-1);
 except
   Result:="";
 end;
//  Result:=TrimRight(Result);
 Seek(f,fp);     //Restore file offset
end;

procedure TExif.Init;
begin
 idfp:=0;

 FImageDesc:="";
 FMake:="";
 FModel:="";
 FOrientation:=1;
 FOrientationDesk:="Normal";
 FDateTime:="";
 FCopyright:="";
 FValid:=False;
 FDateTimeOriginal:="";
 FDateTimeDigitized:="";
 FUserComments:="";
end;

constructor TExif.Create;
begin
 Init;
end;

procedure TExif.ReadFromFile(const FileName: AnsiString);
const ori: Array[1..8] of String=("Normal","Mirrored","Rotated 180","Rotated 180, mirrored","Rotated 90 left, mirrored","Rotated 90 right","Rotated 90 right, mirrored","Rotated 90 left");
var j: TMarker;
 idf: TIFDHeader;
off0: Cardinal; //Null Exif Offset
 tag: TTag;
   i: Integer;
 SOI: Word; //2 bytes SOI marker. FF D8 (Start Of Image)

begin
 if not FileExists(FileName) then exit;
 Init;

 AssignFile(f,FileName);
 reset(f,1);

 BlockRead(f,SOI,2);
 if SOI=$D8FF then begin //Is this Jpeg
   BlockRead(f,j,9);

   if j.Marker=$E0FF then begin //JFIF Marker Found
     Seek(f,20); //Skip JFIF Header
     BlockRead(f,j,9);
   end;

   if j.Marker=$E1FF then begin //If we found Exif Section. j.Indefin="Exif".
     FValid:=True;
     off0:=FilePos(f)+1;   //0"th offset Exif header
     BlockRead(f,idf,11);  //Read IDF Header

     i:=0;
     repeat
       inc(i);
       BlockRead(f,tag,12);
       //0E01 ImageDescription
       if tag.TagID=$010E then FImageDesc:=ReadValue(tag.OffSet+off0,tag.Count);
       //0F01 Make
       if tag.TagID=$010F then FMake:=ReadValue(tag.OffSet+off0,tag.Count);
       //1001 Model
       if tag.TagID=$0110 then FModel:=ReadValue(tag.OffSet+off0,tag.Count);
       //6987 Exif IFD Pointer
       if tag.TagID=$8769 then idfp:=Tag.OffSet; //Read Exif IDF offset
       //1201 Orientation
       if tag.TagID=$0112 then begin
          FOrientation:=tag.OffSet;
          if tag.OffSet in [1..8] then FOrientationDesk:=ori[tag.OffSet] else FOrientationDesk:="Unknown";
       end;
       //3201 DateTime
       if tag.TagID=$0132 then FDateTime:=ReadValue(tag.OffSet+off0,tag.Count);
       //9882 CopyRight
       if tag.TagID=$8298 then FCopyright:=ReadValue(tag.OffSet+off0,tag.Count);
     until (i>11);

     if idfp>0 then begin
       Seek(f,idfp+12+2);//12 - Size header before Exif, 2 - size Exif IFD Number
       i:=0;
       repeat
         inc(i);
         BlockRead(f,tag,12);
 {
         You may simple realize read this info:

         tag |Name of tag

         9A82 ExposureTime
         9D82 FNumber
         0090 ExifVersion
         0390 DateTimeOriginal
         0490 DateTimeDigitized
         0191 ComponentsConfiguration
         0292 CompressedBitsPerPixel
         0192 ShutterSpeedValue
         0292 ApertureValue
         0392 BrightnessValue


 
WondeRu ©   (2005-03-18 12:43) [4]

         0492 ExposureBiasValue
         0592 MaxApertureRatioValue
         0692 SubjectDistance
         0792 MeteringMode
         0892 LightSource
         0992 Flash
         0A92 FocalLength
         8692 UserComments
         9092 SubSecTime
         9192 SubSecTimeOriginal
         9292 SubSecTimeDigitized
         A000 FlashPixVersion
         A001 Colorspace
         A002 Pixel X Dimension
         A003 Pixel Y Dimension
 }

         //0390 FDateTimeOriginal
         if tag.TagID=$9003 then FDateTimeOriginal:=ReadValue(tag.OffSet+off0,tag.Count);
         //0490 DateTimeDigitized
         if tag.TagID=$9004 then FDateTimeDigitized:=ReadValue(tag.OffSet+off0,tag.Count);
         //8692 UserComments
         if tag.TagID=$9286 then FUserComments:=ReadValue(tag.OffSet+off0,tag.Count);
       until (i>23);
     end;
   end;
 end;
 CloseFile(f);
end;

end.


 
Slawan ©   (2005-03-19 03:00) [5]

Спасибо огромное за советы!!! С метаданными типов Exif и IPTC разобрался, но винда всё равно всё по-своему делает:) Мне нужны данные попроще... Похоже, что придётся самому придумывать теги и писать всё под себя, а потом интегрировать в винду... Надо только подумать как:)))
Ещё раз всем огромное спасибо!!!!!!!!!!


 
r.u.s.l.a.n   (2005-07-07 14:25) [6]

А нельзя попроще? Дело в том, что я столкнулся с подобной проблемой, только нужно переименовать файл из PIC001.jpg в значение тега Datetime или примерно так 2005-07-06_09-20-23.jpg и все, большего от Exif мне не требуется. Так может быть, кто-нибудь приведет здесь пример ПРОСТОГО кода для решения этой задачи?


 
Dennis S   (2005-10-11 01:13) [7]

Описанное выше работает, только в процессе использования возник вопрос:
- показывает всю инфо по фотографиям сделанным OLYMPUS-ом, а вот с камеры HP 813 не берёт... только Orientation Desk.

Вопрос:
Не может ли быть, что форматы различны?
Т.е. что Olympus и HP используют различные смещения для хранения информации??????

P.S. - а когда пробовал делать фото-альбом с помощью какой-то проги - из фотографий HP вся инфо была ею надыбана....

В чём фишка?


 
NikeOLD ©   (2006-03-10 15:21) [8]

Фишка в том, что есть утвержденный стандарт EXIF. На сегодняшний день версия 2.1. Но помимо стандарта каждый производитель пихает туда всякого барахла, а докуменацию по этому барахлу найти крайне проблематично, если вообще возможно.
В инете полно прог для извлечения EXIF и они поголовно предупреждают, что могут работать с камерами не любого производителя.



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.02 c
2-1157976752
pavel_guzhanov
2006-09-11 16:12
2006.10.01
Заполнение двумерного массива


2-1158217650
ГореПрограммер
2006-09-14 11:07
2006.10.01
progressbar в statusbar


15-1157976956
vidiv
2006-09-11 16:15
2006.10.01
Клиент SIP протокола для компа (IP-телефония).


2-1158085540
Kiril
2006-09-12 22:25
2006.10.01
Условный путь?


2-1157969626
nstur
2006-09-11 14:13
2006.10.01
Определение позиции Мышки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский