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;

 

编辑器加载中...

posted @ 2012-01-05 13:36  许明吉博客  阅读(3077)  评论(0编辑  收藏  举报