全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2209
推到 Plurk!
推到 Facebook!

用Delphi讀取JPEG文件的縮覽圖

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-04 19:35:11 IP:61.221.xxx.xxx 未訂閱
用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
系統時間:2024-11-26 0:39:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!