TGPBitmap转为TBitmap

TGBBitmap用在GDI+中,而TBitmap用在GDI中,有的时候,我们需要将它们进行转换,例如我们要将一个JPEG的图片的缩略图放到TBitmap中,这样它就可以很方便的被Windows中的多个控件所使用(如ImageList、Image等等控件)。
 
        程序用DELPHI实现,使用了 for  Delphi 的GDI+接口函数,GDI+部分的代码可能与网上的不同,但差别不大。
 
      代码如下:
 
use  gdipapi,gdipobj,gdiputil
 
procedure  TForm1 . ToBitmap(fnames: string );
VAR  Graphics  : TGPGraphics;
     Image, Thumbnail: TGPImage;
     TGPbmp:TGPBitmap;
     bmp:TBitmap;
     hb:HBitmap;
begin
    //打开源图片文件,可以是JPEG、BMP、GIF、TIFF、PNG
    Image:=TGPImage . Create(fnames);
    //创建一个120*120的TGPBitmap,作为绘制缩略图的容器
    TGPbmp:=TGPBitmap . Create( 120 , 120 ,PixelFormat32bppRGB);
    //取得源图片的缩略图
    Thumbnail := image . GetThumbnailImage( 120 , 120 ,   nil ,   nil );
    //绘制缩略图到TGBbmp;
    Graphics :=TGPGraphics . Create(TGPbmp);
    Graphics . DrawImage(Thumbnail,  0 , 0 ,Thumbnail . GetWidth,Thumbnail . GetHeight);
    //创建TBitmap位图
    bmp:=Tbitmap . Create ;
    bmp . width:= 120 ;
    bmp . height:= 120 ;
    //开始转换,hb用于过渡。
    TGBbmp . GetHBITMAP( 0 ,hB);
    bmp . handle:=hb;
   
    {你自己的代码,将bmp用在合适的地方}
    {例如 imagelist1.add(bmp,nil);}
   
    //使用完了,释放.
    Image . free;
    Thumbnail . free;
    Graphics . free;
    TGPbmp . free;
    bmp . free;
 
end ;

 反转换

function  BmpToGPBmp(bmp: TBitmap;alpha: Byte ): TGPBitmap;
var
   x, y: Integer ;
   p0, p1: pbytearray;
   isXPIcon: boolean ;
   ScanLines: array  of  Byte ;
   W, H: integer ;
   Data: TBitmapData;
   CurrentX: integer ;
begin
   bmp . PixelFormat := pf32bit;
   try
     SetLength(ScanLines, Bmp . Height * Bmp . Width * 4 );
     for  y := 0  to  bmp . Height - 1  do
     begin
       p0 := bmp . scanline[y];
       CurrentX := bmp . Width * y * 4 ;
       for  x := 0  to  bmp . Width - 1  do
       begin
         ScanLines[CurrentX + x * 4 ] := p0[x * 4 ];
         ScanLines[CurrentX + x * 4  + 1 ] := p0[x * 4  + 1 ];
         ScanLines[CurrentX + x * 4  + 2 ] := p0[x * 4  + 2 ];
         //设置Alpha
         ScanLines[CurrentX + x * 4  + 3 ] := alpha; // p0[x * 4 + 3];
       end ;
     end ;
 
     Result := TGPBitmap . Create(bmp . Width, bmp . Height); //(bmp.Handle, bmp.Palette); //  ;//
     W := Result . GetWidth;
     H := Result . GetHeight;
     Result . LockBits(MakeRect( 0 , 0 , W, H), ImageLockModeRead or  ImageLockModeWrite, PixelFormat32bppARGB, Data);
     Move(ScanLines[ 0 ], Data . Scan0^, Data . Height * Data . Stride);
     Result . UnlockBits(Data);
   finally
     SetLength(ScanLines, 0 );
   end ;
end ;
 
procedure  TForm1 . Button1Click(Sender: TObject);
var
   bmp: TBitmap;
   g: TGPGraphics;
   img: TGPBitmap;
begin
   bmp := TBitmap . Create;
   bmp . LoadFromFile( 'c:\a.bmp' );
   img := BmpToGPBmp(bmp, 150 );
   g := TGPGraphics . Create(Canvas . Handle);
   try
     g . DrawImage(img, 0 , 0 ,img . GetWidth ,img . GetHeight );
   finally
     FreeAndNil(g);
     FreeAndNil(img);
     FreeAndNil(bmp);
   end ;
end ;

你可能感兴趣的:(TGPBitmap转为TBitmap)