Форум: "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.017 c