Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как узнать информацию о файле?


Автор: DOOMSoft 29.9.2005, 15:59
Как узнать информацию о файле? Если это фотка то дата съемки и тд. если mp3 то название песни, альбом, исполнитель???

Автор: Rennigth 29.9.2005, 17:33
Ну для фотографии дата съемки это наверное все-таки дата создания файла, а остальное(кстати что именно) зависит от формата, что за формат - то.
PS: ну нету у меня цифровика smile

Для mp3 ID3V1 Tag это последние 128 байт файла, ID3V2 немного хитрее, находиться в начале файла.
Вот код для извлечения Tag-а из mp3. Код паршивый писал года 3-4-ре назад но насколько помню работал, переписывать в падлу smile

Код

Procedure GetMp3Tag(Filename:string;var tagrec:ttagrec;var tagbool:boolean); // TTagRec = array [0..11] of string;
const
  MAXBytes = (High(integer) - $F) div sizeof(byte);
type
  TByteArray = array[0..MAXBytes] of byte;
  PByteArray = ^TByteArray;
  Tconstmas = array [0..11,0..3] of byte;
const
  ID3v1: array[0..2]of byte  =(84,65,71);  //54, 41, 47
  ID3v2: array[0..2]of byte  =(73,68,51);   // 49, 44, 33
  EndID3:array[0..1]of byte  =(255,251);
  Constlist:Tconstmas=(
  (84,69,78,67),(87,88,88,88),(84,67,79,80),
  (84,79,80,69),(84,67,79,77),(84,67,79,78),
  (84,82,67,75),(67,79,77,77),(84,89,69,82),
  (84,65,76,66),(84,80,69,49),(84,73,84,50));
  {Encodedby,URL,Copyrigth,
  Origartist,Composer,Genre,
  Track,Comment,Year,
  Album,Artist,Title}
var
  Buf : PByteArray;
  FileLength,FileHandle,i,j,k,nseek,lengthConst,SizeBuf: Integer;
  z:byte;
  bool:boolean;
  mas1:array [0..63] of byte;
begin
  for i:=0 to 11 do
    tagrec[i]:='';
  tagbool:=true;
  FileHandle := FileOpen(Filename,2);

  //ID3v1
  FileLength := FileSeek(FileHandle,0,2);
  FileSeek(FileHandle,filelength-128,0);
  FileRead(FileHandle,mas1,64);
  bool:=true;
  for i:=0 to 2 do
    if mas1[i]<>ID3v1[i] then bool:=false;
  if bool=true then begin
    for i:=0 to 29 do begin
      TagRec[11]:=tagrec[11]+chr(mas1[i+3]);  //title
      TagRec[10]:=tagrec[10]+chr(mas1[i+33]); //artist
    end;
  end else begin
// Проверка на ID3v2
    SizeBuf:=3;
    GetMem(Buf, SizeBuf*sizeof(byte));
    FileSeek(FileHandle,0,0);
    FileRead(FileHandle,Buf^,3);
    bool:=true;
    for i:=0 to 2 do
      if Buf^[i]<>ID3v2[i] then bool:=false;
    FreeMem(Buf, SizeBuf*sizeof(byte));
    if bool=true then begin
// поиск конкретного значения (сравнение с ConstList)
      for z:=10 to 11 do begin
        SizeBuf:=8;
        GetMem(Buf, SizeBuf*sizeof(byte));
        nseek:=10;
        repeat
          FileSeek(FileHandle,nseek,0);
          FileRead(FileHandle,Buf^,8);
          bool:=true;
          for j:=0 to 3 do
            if buf^[j]<>constlist[z,j] then bool:=false;
          if bool=false then nseek:=nseek+10+(buf^[7]);
        until bool=true or((buf^[4]=255)and(buf^[5]=251));
        lengthConst:=buf^[7]-1;
        FreeMem(Buf, SizeBuf*sizeof(byte));
// чтение записи
        SizeBuf:=lengthConst;
        GetMem(Buf,SizeBuf*sizeof(byte));
        FileSeek(FileHandle,nseek+11,0);
        FileRead(FileHandle,Buf^,SizeBuf);
        for k:=0 to SizeBuf do
          TagRec[z]:=tagrec[z]+chr(buf^[k]);
        FreeMem(Buf, SizeBuf*sizeof(byte));
      end;
    end else
      tagbool:=false;
  end;
  FileClose(FileHandle);
end;


Автор: z-END 29.9.2005, 17:40
Цитата(Rennigth @ 29.9.2005, 18:33)
Ну для фотографии дата съемки это наверное все-таки дата создания файла

свосем не обязательно... нужно смотреть EXIF (метаданные JPEG) я чесно говоря незнаю как это делается, но данные эти не являются комерческой тайной и найти их при желании непроблеммаsmile)

Автор: DOOMSoft 29.9.2005, 22:45
Дата создания не совпадает с датой съемки.

Цитата(Rennigth @ 29.9.2005, 17:33)
Ну для фотографии дата съемки это наверное все-таки дата создания файла, а остальное(кстати что именно) зависит от формата, что за формат - то.


Фотки в формате JPEG... (а что бывают другие?)
Оттуда нужно достать только дату и время, ну еще и ширину с высотой.

Автор: z-END 30.9.2005, 09:13
Цитата(DOOMSoft @ 29.9.2005, 23:45)
Фотки в формате JPEG... (а что бывают другие?)

более профессиональные модели снимают в TIFF или RAW

Автор: Romikgy 30.9.2005, 13:14
Мало вероятно , что бы джепег цифровиков писал такую инфу в файлы (о своем создании) smile

Автор: _hunter 30.9.2005, 13:33
пишет он...
IPTC info зовется...
а вот как читать -- хз. нужно формат JPEG смотреть...

Автор: Romikgy 30.9.2005, 14:08
Извеняюсь тогда smile
Можно посмотреть здесь:
http://multipart-mixed.com/photo/iptc.html
если знаешь перл smile
или у ирфанвью есть длл которая читает это, наверное можно ее поюзать.

Автор: z-END 30.9.2005, 14:56
Цитата(_hunter @ 30.9.2005, 14:33)
пишет он...
IPTC info зовется...

имхо ты несовсем прав... эти данные пиуштся в EXIF а IPTC исползуется для "дополнительных данных", ну или их меня перводчик хреновыйsmile
Цитата

IPTC information details
Originally designed to allow press photographers to provide information concerning images they sent back to the home office, IPTC fields can be used to store supplemental information about an image. IPTC information differs from EXIF information in that EXIF information is generated by the digital camera and contains information about various camera settings. IPTC fields can be used to “annotate” images with a great deal of information.

Автор: Romikgy 30.9.2005, 16:00
Может поможет ( прикольно звучит) :
http://www.watermarker.com/exif-iptc-gps/
http://www.dalbum.org/index.php?go=ExifLine
http://home.pacbell.net/michal_k/exif_v.html
Добавлено @ 16:03
http://www.reneris.com/tools/ExifCopyUsage.asp
Точно должна помочь smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)