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;
编辑器加载中...