GRAPHIC32를 도형처리에 리용하면서 png파일의 적재속도가 떠서 다음의 방법으로 속도를 올렸습니다.
먼저 png를 gdi+의 TGPBitmap에 읽어들이고 LockBits, CopyMemory를 써서 tbitmap32에 복사합니다.
uses ..., GDIPAPI, GDIPOBJ, GDIPUTIL;
img1 : TImgView32;
procedure TForm1.btn1Click(Sender: TObject);
var gbmp: TGPBitmap;
bmpdata : TBitmapData;
bytes : Cardinal;
path : string;
begin
path := ExtractFilePath(Application.ExeName);
gbmp := TGPBitmap.Create(path + 'bliss.png');
img1.Bitmap.SetSize(gbmp.GetWidth, gbmp.GetHeight);
gbmp.LockBits(MakeRect(rect(0, 0, gbmp.GetWidth-1, gbmp.GetHeight-1)),
ImageLockModeRead, PixelFormat32bppARGB, bmpdata);
bytes := bmpdata.Stride * bmpdata.Height;
CopyMemory(img1.Bitmap.Bits, bmpdata.Scan0, bytes);
gbmp.Free;
img1.Bitmap.DrawMode:= dmBlend;
end;
gdi+의 빠른 적재속도와 TGPBitmap에서 png의 픽셀포맷이 ARGB인것을 리용하여 속도와 투명도를 다 보장하려는 시도였습니다.
이렇게 하면 tbitmap32의 loadfromfile을 쓸때 보다 4배정도 빨라집니다.
|