Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Поисковик картинок для чайника:)


Автор: Serchos 7.3.2010, 02:18
Помогите пожалуйста вот с такой проблемой...У меня на компьютере много картинок и я хочу сделать программку по поиску той или иной картинки. Только хочу сделать чтобы находилось по ID(или как это называется) картинки. Типа как музыку по исполнителю. В данном случае наверное по дате создания, разрешению, глубине цвета и т.п. Просто я начинающий(чайник) в этом деле и пытаюсь учиться с исходников). Буду очень признателен в вашей помощи...Спасибо!

Автор: Serchos 7.3.2010, 11:49
Уже искал...ID только музыки а вот "ID" картинок немогу найти(

Автор: Proxin 7.3.2010, 11:56
что понимаете под id картинки?

Автор: Данкинг 7.3.2010, 12:20
Что за ID? Всякие там "метаданные", конечно, в .jpg есть, но никаких идентификаторов я там не нашёл.

Автор: Serchos 7.3.2010, 13:46
Я еще раз говорю что я чайник)...
просто существует ID3 - (от англ. Identify a MP3) — формат метаданных, наиболее часто используемый в звуковых файлах в формате MP3. ID3 подпись содержит данные о названии трека, альбома, имени исполнителя и т. д., которые используются мультимедиапроигрывателями и другими программами, а также аппаратными проигрывателями, для отображения информации о файле и автоматического упорядочивания аудиоколлекции.(по данным Wikipedia)
Может я называю неправильно - "ID картинки"...Но как подругому назвать незнаю)...

Автор: Данкинг 7.3.2010, 14:04
Цитата(Serchos @  7.3.2010,  13:46 Найти цитируемый пост)
Может я называю неправильно - "ID картинки"...Но как подругому назвать незнаю)...

Ну а у картинки-то откуда сиё? Единственно что есть - это те самые метаданные у .jpg:
http://radikal.ru/F/s60.radikal.ru/i169/1003/9c/9a060cdd5dca.jpg.html
Но они далеко не у всех графических файлов имеются. К тому же, по каким именно параметрам там искать? Не по модели фотоаппарата же. smile 

Автор: Serchos 7.3.2010, 14:41

 ! 
THandle
Модератор: используйте подсветку кода!

Да действительно метаданные))...у *.bmp нашел вот что:
Код


procedure TForm1.Button1Click(Sender: TObject);   
 var  
   fileheader: TBitmapfileheader;   
   infoheader: TBitmapinfoheader;   
   s: TFilestream;   
 begin  
   s := TFileStream.Create('c:\YourBitmap.bmp', fmOpenRead);   
   try  
     s.Read(fileheader, SizeOf(fileheader));   
     s.Read(infoheader, SizeOf(infoheader));   
   finally  
     s.Free;   
   end;   
   listbox1.Items.Clear;   
   listbox1.Items.Add('Filesize:    ' + IntToStr(fileheader.bfSize));   
   listbox1.Items.Add('Width:       ' + IntToStr(infoheader.biWidth));   
   listbox1.Items.Add('Height:      ' + IntToStr(infoheader.biHeight));   
   listbox1.Items.Add('BitCount:    ' + IntToStr(infoheader.biBitCount));   
   listbox1.Items.Add('Used:        ' + IntToStr(infoheader.biClrUsed));   
 end;   


но как-то мало информации...и к тому же только *.bmp...хотелась бы еще для *.jpg и *.png...ну и информации побольше))

Код



Автор: Данкинг 7.3.2010, 14:55
Цитата(Serchos @  7.3.2010,  14:41 Найти цитируемый пост)
Filesize

Цитата(Serchos @  7.3.2010,  14:41 Найти цитируемый пост)
Height

Цитата(Serchos @  7.3.2010,  14:41 Найти цитируемый пост)
Width

Эти параметры у любой картинки есть. smile А первый - так вообще у любого файла. smile 

Автор: Coder 7.3.2010, 15:21
Тебе нужно читать EXIF информацию из JPEG файла - там есть дата, модель камеры, различные параметры съемки и иногда бывает GPS информация ;)

Автор: Serchos 8.3.2010, 13:13
Цитата(Coder @ 7.3.2010,  15:21)
Тебе нужно читать EXIF информацию из JPEG файла - там есть дата, модель камеры, различные параметры съемки и иногда бывает GPS информация ;)

а можно поподробнее...а то я че-то не понимаю)...(чайник чего говорить)

Добавлено через 1 минуту и 19 секунд
и кстати правильно я сделал подсветку кода?

Автор: Данкинг 8.3.2010, 13:40
Цитата(Serchos @  8.3.2010,  13:13 Найти цитируемый пост)
а можно поподробнее...а то я че-то не понимаю)...(чайник чего говорить)

Поищи http://forum.vingrad.ru/act-Search/CODE/show/searchid-3da3a3d400aac56bf755be4f98aa6280/search_in-posts/result_type/topics/flag/search/highlite/exif/index.html по слову "exif", или же на просторах тырнета. smile 

Цитата(Serchos @  8.3.2010,  13:13 Найти цитируемый пост)
и кстати правильно я сделал подсветку кода? 

Правильно, молодец. smile 

Автор: Snowy 9.3.2010, 12:14
http://www.delphilab.ru/content/view/301/1/

Автор: Serchos 9.3.2010, 13:47
Цитата(Snowy @ 9.3.2010,  12:14)
http://www.delphilab.ru/content/view/301/1/

Спасибо за ссылку и информацию...только не идет она у меня на Delphi 7 smile. Про Exif в *.jpeg почитал...много полезной информации но вот как дело обстоит с *.png?  

Автор: Данкинг 9.3.2010, 13:55
Цитата(Serchos @  9.3.2010,  13:47 Найти цитируемый пост)
но вот как дело обстоит с *.png?

В .png ничего такого нет. Там только обычные параметры - длина, ширина, глубина цвета.

Автор: Serchos 9.3.2010, 17:29
Цитата(Данкинг @ 9.3.2010,  13:55)

В .png ничего такого нет. Там только обычные параметры - длина, ширина, глубина цвета.

А как вообще у *.png узнать обычные параметры?)

Автор: Данкинг 9.3.2010, 17:32
Цитата(Serchos @  9.3.2010,  17:29 Найти цитируемый пост)
А как вообще у *.png узнать обычные параметры?) 

DRKB в помощь.
Код

unit ImgSize; 

 

interface 

 

uses Classes; 

 

 

procedure GetJPGSize(const sFile: string; var wWidth, wHeight: Word); 

procedure GetPNGSize(const sFile: string; var wWidth, wHeight: Word); 

procedure GetGIFSize(const sGIFFile: string; var wWidth, wHeight: Word); 

 

 

implementation 

 

uses SysUtils; 

 

function ReadMWord(f: TFileStream): Word; 

type 

TMotorolaWord = record 

   case Byte of 

     0: (Value: Word); 

     1: (Byte1, Byte2: Byte); 

end; 

var 

MW: TMotorolaWord; 

begin 

{ It would probably be better to just read these two bytes in normally } 

{ and then do a small ASM routine to swap them.  But we aren't talking } 

{ about reading entire files, so I doubt the performance gain would be } 

{ worth the trouble. } 

f.read(MW.Byte2, SizeOf(Byte)); 

f.read(MW.Byte1, SizeOf(Byte)); 

Result := MW.Value; 

end; 

 

procedure GetJPGSize(const sFile: string; var wWidth, wHeight: Word); 

const 

ValidSig: array[0..1] of Byte = ($FF, $D8); 

Parameterless = [$01, $D0, $D1, $D2, $D3, $D4, $D5, $D6, $D7]; 

var 

Sig: array[0..1] of byte; 

f: TFileStream; 

x: integer; 

Seg: byte; 

Dummy: array[0..15] of byte; 

Len: word; 

ReadLen: LongInt; 

begin 

FillChar(Sig, SizeOf(Sig), #0); 

f := TFileStream.Create(sFile, fmOpenRead); 

try 

   ReadLen := f.read(Sig[0], SizeOf(Sig)); 

 

   for x := Low(Sig) to High(Sig) do 

     if Sig[x] <> ValidSig[x] then ReadLen := 0; 

 

   if ReadLen > 0 then 

   begin 

     ReadLen := f.read(Seg, 1); 

     while (Seg = $FF) and (ReadLen > 0) do 

     begin 

       ReadLen := f.read(Seg, 1); 

       if Seg <> $FF then 

       begin 

         if (Seg = $C0) or (Seg = $C1) then 

         begin 

           ReadLen := f.read(Dummy[0], 3); { don't need these bytes } 

           wHeight := ReadMWord(f); 

           wWidth  := ReadMWord(f); 

         end 

         else 

         begin 

           if not (Seg in Parameterless) then 

           begin 

             Len := ReadMWord(f); 

             f.Seek(Len - 2, 1); 

             f.read(Seg, 1); 

           end 

           else 

             Seg := $FF; { Fake it to keep looping. } 

         end; 

       end; 

     end; 

   end; 

finally 

   f.Free; 

end; 

end; 

 

procedure GetPNGSize(const sFile: string; var wWidth, wHeight: Word); 

type 

TPNGSig = array[0..7] of Byte; 

const 

ValidSig: TPNGSig = (137,80,78,71,13,10,26,10); 

var 

Sig: TPNGSig; 

f: tFileStream; 

x: integer; 

begin 

FillChar(Sig, SizeOf(Sig), #0); 

f := TFileStream.Create(sFile, fmOpenRead); 

try 

   f.read(Sig[0], SizeOf(Sig)); 

   for x := Low(Sig) to High(Sig) do 

     if Sig[x] <> ValidSig[x] then Exit; 

   f.Seek(18, 0); 

   wWidth := ReadMWord(f); 

   f.Seek(22, 0); 

   wHeight := ReadMWord(f); 

finally 

   f.Free; 

end; 

end; 

 

 

procedure GetGIFSize(const sGIFFile: string; var wWidth, wHeight: Word); 

type 

TGIFHeader = record 

   Sig: array[0..5] of char; 

   ScreenWidth, ScreenHeight: Word; 

   Flags, Background, Aspect: Byte; 

end; 

 

TGIFImageBlock = record 

   Left, Top, Width, Height: Word; 

   Flags: Byte; 

end; 

var 

f: file; 

Header: TGifHeader; 

ImageBlock: TGifImageBlock; 

nResult: integer; 

x: integer; 

c: char; 

DimensionsFound: boolean; 

begin 

wWidth  := 0; 

wHeight := 0; 

 

if sGifFile = '' then 

   Exit; 

 

{$I-} 

FileMode := 0;   { read-only } 

AssignFile(f, sGifFile); 

reset(f, 1); 

if IOResult <> 0 then 

   { Could not open file } 

   Exit; 

 

{ Read header and ensure valid file. } 

BlockRead(f, Header, SizeOf(TGifHeader), nResult); 

if (nResult <> SizeOf(TGifHeader)) or (IOResult <> 0) or 

   (StrLComp('GIF', Header.Sig, 3) <> 0) then 

begin 

   { Image file invalid } 

   Close(f); 

   Exit; 

end; 

 

{ Skip color map, if there is one } 

if (Header.Flags and $80) > 0 then 

begin 

   x := 3 * (1 shl ((Header.Flags and 7) + 1)); 

   Seek(f, x); 

   if IOResult <> 0 then 

   begin 

     { Color map thrashed } 

     Close(f); 

     Exit; 

   end; 

end; 

 

DimensionsFound := False; 

FillChar(ImageBlock, SizeOf(TGIFImageBlock), #0); 

{ Step through blocks. } 

BlockRead(f, c, 1, nResult); 

while (not EOF(f)) and (not DimensionsFound) do 

begin 

   case c of 

     ',': { Found image } 

       begin 

         BlockRead(f, ImageBlock, SizeOf(TGIFImageBlock), nResult); 

         if nResult <> SizeOf(TGIFImageBlock) then 

         begin 

           { Invalid image block encountered } 

           Close(f); 

           Exit; 

         end; 

         wWidth := ImageBlock.Width; 

         wHeight := ImageBlock.Height; 

         DimensionsFound := True; 

       end; 

     'y': { Skip } 

       begin 

         { NOP } 

       end; 

     { nothing else.  just ignore } 

   end; 

   BlockRead(f, c, 1, nResult); 

end; 

Close(f); 

{$I+} 

end; 

 

end. 


Автор: Serchos 13.3.2010, 12:32
Всем спасибо за помощь!...все работает!

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