久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Delphi縮略圖讀取

 aaie_ 2012-10-09
create   Thumbnails?  
Author:   Roy   Magne   Klever    
{  
    Here   is   the   routine   I   use   in   my   thumbnail   component   and   I   belive   it   is   quite  
    fast.  
    A   tip   to   gain   faster   loading   of   jpegs   is   to   use   the   TJpegScale.Scale  
    property.   You   can   gain   a   lot   by   using   this   correct.  

    This   routine   can   only   downscale   images   no   upscaling   is   supported   and   you  
    must   correctly   set   the   dest   image   size.   The   src.image   will   be   scaled   to   fit  
    in   dest   bitmap.  
}  

//Speed   up   by   Renate   Schaaf,   Armido,   Gary   Williams...  
procedure   MakeThumbNail(src,   dest:   tBitmap);  
type  
    PRGB24   =   ^TRGB24;  
    TRGB24   =   packed   record  
        B:   Byte;  
        G:   Byte;  
        R:   Byte;  
    end;  
var  
    x,   y,   ix,   iy:   integer;  
    x1,   x2,   x3:   integer;  

    xscale,   yscale:   single;  
    iRed,   iGrn,   iBlu,   iRatio:   Longword;  
    p,   c1,   c2,   c3,   c4,   c5:   tRGB24;  
    pt,   pt1:   pRGB24;  
    iSrc,   iDst,   s1:   integer;  
    i,   j,   r,   g,   b,   tmpY:   integer;  

    RowDest,   RowSource,   RowSourceStart:   integer;  
    w,   h:   integer;  
    dxmin,   dymin:   integer;  
    ny1,   ny2,   ny3:   integer;  
    dx,   dy:   integer;  
    lutX,   lutY:   array   of   integer;  

begin  
    if   src.PixelFormat   <>   pf24bit   then   src.PixelFormat   :=   pf24bit;  
    if   dest.PixelFormat   <>   pf24bit   then   dest.PixelFormat   :=   pf24bit;  
    w   :=   Dest.Width;  
    h   :=   Dest.Height;  

    if   (src.Width   <=   FThumbSize)   and   (src.Height   <=   FThumbSize)   then  
    begin  
        dest.Assign(src);  
        exit;  
    end;  

    iDst   :=   (w   *   24   +   31)   and   not   31;  
    iDst   :=   iDst   div   8;   //BytesPerScanline  
    iSrc   :=   (Src.Width   *   24   +   31)   and   not   31;  
    iSrc   :=   iSrc   div   8;  

    xscale   :=   1   /   (w   /   src.Width);  
    yscale   :=   1   /   (h   /   src.Height);  

    //   X   lookup   table  
    SetLength(lutX,   w);  
    x1   :=   0;  
    x2   :=   trunc(xscale);  
    for   x   :=   0   to   w   -   1   do  
    begin  
        lutX[x]   :=   x2   -   x1;  
        x1   :=   x2;  
        x2   :=   trunc((x   +   2)   *   xscale);  
    end;  

    //   Y   lookup   table  
    SetLength(lutY,   h);  
    x1   :=   0;  
    x2   :=   trunc(yscale);  
    for   x   :=   0   to   h   -   1   do  
    begin  
        lutY[x]   :=   x2   -   x1;  
        x1   :=   x2;  
        x2   :=   trunc((x   +   2)   *   yscale);  
    end;  

    dec(w);  
    dec(h);  
    RowDest   :=   integer(Dest.Scanline[0]);  
    RowSourceStart   :=   integer(Src.Scanline[0]);  
    RowSource   :=   RowSourceStart;  
    for   y   :=   0   to   h   do  
    begin  
        dy   :=   lutY[y];  
        x1   :=   0;  
        x3   :=   0;  
        for   x   :=   0   to   w   do  
        begin  
            dx:=   lutX[x];  
            iRed:=   0;  
            iGrn:=   0;  
            iBlu:=   0;  
            RowSource   :=   RowSourceStart;  
            for   iy   :=   1   to   dy   do  
            begin  
                pt   :=   PRGB24(RowSource   +   x1);  
                for   ix   :=   1   to   dx   do  
                begin  
                    iRed   :=   iRed   +   pt.R;  
                    iGrn   :=   iGrn   +   pt.G;  
                    iBlu   :=   iBlu   +   pt.B;  
                    inc(pt);  
                end;  
                RowSource   :=   RowSource   -   iSrc;  
            end;  
            iRatio   :=   65535   div   (dx   *   dy);  
            pt1   :=   PRGB24(RowDest   +   x3);  
            pt1.R   :=   (iRed   *   iRatio)   shr   16;  
            pt1.G   :=   (iGrn   *   iRatio)   shr   16;  
            pt1.B   :=   (iBlu   *   iRatio)   shr   16;  
            x1   :=   x1   +   3   *   dx;  
            inc(x3,3);  
        end;  
        RowDest   :=   RowDest   -   iDst;  
        RowSourceStart   :=   RowSource;  
    end;  

    if   dest.Height   <   3   then   exit;  

    //   Sharpening...  
    s1   :=   integer(dest.ScanLine[0]);  
    iDst   :=   integer(dest.ScanLine[1])   -   s1;  
    ny1   :=   Integer(s1);  
    ny2   :=   ny1   +   iDst;  
    ny3   :=   ny2   +   iDst;  
    for   y   :=   1   to   dest.Height   -   2   do  
    begin  
        for   x   :=   0   to   dest.Width   -   3   do  
        begin  
            x1   :=   x   *   3;  
            x2   :=   x1   +   3;  
            x3   :=   x1   +   6;  

            c1   :=   pRGB24(ny1   +   x1)^;  
            c2   :=   pRGB24(ny1   +   x3)^;  
            c3   :=   pRGB24(ny2   +   x2)^;  
            c4   :=   pRGB24(ny3   +   x1)^;  
            c5   :=   pRGB24(ny3   +   x3)^;  

            r   :=   (c1.R   +   c2.R   +   (c3.R   *   -12)   +   c4.R   +   c5.R)   div   -8;  
            g   :=   (c1.G   +   c2.G   +   (c3.G   *   -12)   +   c4.G   +   c5.G)   div   -8;  
            b   :=   (c1.B   +   c2.B   +   (c3.B   *   -12)   +   c4.B   +   c5.B)   div   -8;  

            if   r   <   0   then   r   :=   0   else   if   r   >   255   then   r   :=   255;  
            if   g   <   0   then   g   :=   0   else   if   g   >   255   then   g   :=   255;  
            if   b   <   0   then   b   :=   0   else   if   b   >   255   then   b   :=   255;  

            pt1   :=   pRGB24(ny2   +   x2);  
            pt1.R   :=   r;  
            pt1.G   :=   g;  
            pt1.B   :=   b;  
        end;  
        inc(ny1,   iDst);  
        inc(ny2,   iDst);  
        inc(ny3,   iDst);  
    end;  
end;  




用Delphi讀取JPEG文件的縮覽圖
--------------------------------------------------------------------------------
  JPEG圖像文件以高壓縮比和高圖像質(zhì)量著稱,,市面上的圖庫光盤中的圖像文件大都是JPEG格式的。怎樣從一大堆JPEG文件中查找合適的圖像呢,?使用JPEG文件的縮覽圖就是其中方法之一,。
  在PhotoShop   4.0(或以上版本)的打開文件對話框中,當(dāng)打開JPEG文件時,,PhotoShop很快把它的縮覽圖顯示出來,。為什么PhotoShop能這么快地顯示出JPEG文件的縮覽圖呢?
  原來PhotoShop在保存JPEG文件時把它的縮覽圖也保存在文件里,。PhotoShop定義了新的段FF   ED,,這個段保存了一個JPEG文件格式的縮覽圖,大圖中有小圖,。FF   ED段后兩個字節(jié)是這個段的長度,,在這個段里有縮覽圖的開始標(biāo)志FF   D8和結(jié)束標(biāo)志FF   D9,將這個段拷貝出來即可獲得該圖的縮覽圖,。值得注意的是PhotoShop   4.0解出的縮覽圖,,像素格式不是常規(guī)的RGB,而是BGR格式,所以還得加入BGR轉(zhuǎn)為RGB的代碼,轉(zhuǎn)化過程是在內(nèi)存里把B和R的位置交換,。
  下面是Delphi編寫的快速讀取PhotoShop   4.0(或以上版本)JPEG文件的縮覽圖的程序,程序用TFileStream讀取JPEG文件的FF   ED段,,結(jié)合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個字節(jié)處
  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個字節(jié)則文件不包含縮覽圖,,退出程序
  begin
  fstream.free;
  exit;
  end;
  mstream:=TMemorystream.Create;//建立內(nèi)存流
  mstream.CopyFrom(fstream,j);   //把FF   ED段拷貝到mstream
  data:=mstream.Memory;
  for   i:=300   to   700   do   //找縮覽圖的開始標(biāo)志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轉(zhuǎn)BMP
  if   PWORD(@data[i+57])^=$2e34   then   //PhotoShop   4.0的縮覽圖
  BGR2RGB(bmp);   //BMP的像素格式BGR   而不是RGB,要把BGR轉(zhuǎn)化為RGB
  result:=bmp;   //函數(shù)返回BMP
  mstream.Free;
  fjpg.Free;   //釋放Object
  end;end;
  fstream.free;
  end;
  可直接把Delphi   的Timage可視控件拖到Form上,,用image.picture.bitmap:=   LoadThumb(filename)   即可顯示PhotoShop   JPEG文件的縮覽圖。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多