用Delphi讀取JPEG文件的縮覽圖 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
用Delphi讀取JPEG文件的縮覽圖
(作者:江天送 2000年10月12日 15:39) JPEG圖像文件以高壓縮比和高圖像質量著稱,市面上的圖庫光碟中的圖像文件大都是JPEG格式的。怎樣從一大堆JPEG文件中查找合適的圖像呢?使用JPEG文件的縮覽圖就是其中方法之一。 在PhotoShop 4.0(或以上版本)的打開文件對話方塊中,當打開JPEG文件時,PhotoShop很快把它的縮覽圖顯示出來。?什?PhotoShop能這?快地顯示出JPEG文件的縮覽圖呢? 原來PhotoShop在保存JPEG文件時把它的縮覽圖也保存在文件裏。PhotoShop定義了新的段FF ED,這個段保存了一個JPEG文件格式的縮覽圖,大圖中有小圖。FF ED段後兩個位元組是這個段的長度,在這個段裏有縮覽圖的開始標誌FF D8和結束標誌FF D9,將這個段拷貝出來即可獲得該圖的縮覽圖(見圖1)。值得注意的是PhotoShop 4.0解出的縮覽圖,圖元格式不是常規的RGB,而是BGR格式,所以還得加入BGR轉?RGB的代碼,轉化過程是在記憶體裏把B和R的位置交換。 下面是Delphi編寫的快速讀取PhotoShop 4.0(或以上版本)JPEG文件的縮覽圖的程式,程式用TFileStream讀取JPEG文件的FF ED段,結合TmemoryStream、TJPEGimage, 返回BMP格式的縮覽圖。 function LoadThumb(filename:shortstring):TBitmap; procedure BGR2RGB(var bmp:TBitmap); var x,y:integer; t:char; data:pchar; begin for y:=bmp.Height-1 downto 0 do begin data:=bmp.ScanLine[y]; for x:=0 to bmp.Width-1 do begin t:=data[x*3]; data[x*3]:=data[x*3+2]; data[x*3+2]:=t; end; end; end; var fstream:Tfilestream; mstream:Tmemorystream; j,i:word;data:pchar; buf:array [0..3] of byte; filesize:DWORD; fjpg:Tjpegimage;bmp:Tbitmap; begin result:=nil; fstream:=Tfilestream.create(filename,fmOpenRead); //建立文件流,讀JPEG文件 fstream.Seek(20,soFromBeginning); //FF ED段在文件的第20個位元組處 fstream.Read(buf,sizeof(buf)); if PWORD(@buf[0])^=$EDFF then begin j:=buf[2]*256+buf[3]; //FF ED的大小,高位在前,低位元在後 if j<1024 then //FF ED段的大小若?1024個位元組則文件不包含縮覽圖,退出程式 begin fstream.free; exit; end; mstream:=TMemorystream.Create;//建立記憶體流 mstream.CopyFrom(fstream,j); //把FF ED段拷貝到mstream data:=mstream.Memory; for i:=300 to 700 do //找縮覽圖的開始標誌FF D8 if PWORD(@data[i])^=$D8FF then break; if i<700 then begin fjpg:=Tjpegimage.Create; //建立TJPEGimage 解出縮覽圖 bmp:=TBitmap.Create; mstream.Position:=i; fjpg.LoadFromStream(mstream);//fjpg讀取mstream bmp.Assign(fjpg); //JPEG轉BMP if PWORD(@data[i 57])^=$2e34 then //PhotoShop 4.0的縮覽圖 BGR2RGB(bmp); //BMP的圖元格式BGR 而不是RGB,要把BGR轉化?RGB result:=bmp; //函數返回BMP mstream.Free; fjpg.Free; //釋放Object end;end; fstream.free; end;
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |