±×·¡ÇÈ Ã³¸®½Ã TBitmap À¸·ÎºÎÅÍ GDI+ ¿ëÀÇ TGPBitmapÀ» ¾ò´Â °£´ÜÇÑ ¹æ¹ýÀº ¾Æ·¡¿Í °°´Ù.
if (Bitmap.PixelFormat in [pf1Bit, pf4Bit, pf8Bit]) then GPBitmap := TGPBitmap.Create(Bitmap.Handle, Bmp.Palette) else GPBitmap := TGPBitmap.Create(Bitmap.Handle, 0);
ÀÌ ¹æ¹ýÀÇ ¹®Á¦´Â TBitmapÀÇ ¾ËÆÄä³Î µ¥ÀÌÅ͸¦ ÀÒ´Â °ÍÀÌ´Ù. ¾Æ·¡ ÇÔ¼ö´Â TBitmapÀÇ ¾ËÆÄä³Î µ¥ÀÌÅ͸¦ ÀÒÁö ¾Ê°í TBitmap À¸·ÎºÎÅÍ GDI+ ¿ëÀÇ TGPBitmapÀ» ¾ò´Â´Ù.
// ¾ËÆÄä³ÎÀÇ °ªÀ» ÀÒÁö ¾Ê°í TBitmapÀ¸·Î ºÎÅÍ GDI+ TGPBitmapÀ» ¾ò´Â ÇÔ¼ö function GetGPBitmap(Bmp: TBitmap): TGPBitmap; var Header: PBitmapV5Header; DC: HDC; Bits: Pointer; hNewBitmap: HBITMAP; ldc : HDC;
R: TGPRect; ScanedLines: integer; BitmapData: TBitmapData; srcbmp : Bitmap; srcdib : array of TRGBQUAD; srcdibbmap : TBITMAPINFO; begin //Load the source bitmaps information if (GetObject(Bmp.Handle, sizeof(srcbmp), @srcbmp) = 0) then begin result := nil; exit; end;
SetLength(srcdib, srcbmp.bmWidth * srcbmp.bmHeight);
//Load source bits into srcdib srcdibbmap.bmiHeader.biSize := sizeof(srcdibbmap.bmiHeader); srcdibbmap.bmiHeader.biWidth := srcbmp.bmWidth; srcdibbmap.bmiHeader.biHeight := -srcbmp.bmHeight; srcdibbmap.bmiHeader.biPlanes := 1; srcdibbmap.bmiHeader.biBitCount := 32; srcdibbmap.bmiHeader.biCompression := BI_RGB;
ldc := CreateCompatibleDC(0); ScanedLines := GetDIBits(ldc, Bmp.Handle, 0, srcbmp.bmHeight, srcdib, srcdibbmap, DIB_RGB_COLORS); DeleteDC(ldc); if ScanedLines <> Bmp.Height then begin result := nil; exit; end;
// Create GPBitmap and copy DIB values of source Bitmap R := MakeRect(0, 0, Bmp.Width, Bmp.Height); // 1. BitmapÀÇ DIB value °ªÀ» (º¹»ç°úÁ¤ ¾øÀÌ) ¹Ù·Î ÃëÇϵµ·Ï ÇÒ °æ¿ì BitmapData.Width := Bmp.Width; BitmapData.Height := Bmp.Height; BitmapData.Stride := Bmp.Width * 4; BitmapData.Scan0 := @srcdib[0]; BitmapData.Reserved := 0; if Bmp.AlphaFormat = afPremultiplied then begin BitmapData.PixelFormat := PixelFormat32bppPARGB; result := TGPBitmap.Create(Bmp.Width, Bmp.Height, PixelFormat32bppPARGB); result.LockBits(R, ImageLockModeWrite or ImageLockModeUserInputBuf, PixelFormat32bppPARGB, BitmapData); end else begin BitmapData.PixelFormat := PixelFormat32bppARGB; result := TGPBitmap.Create(Bmp.Width, Bmp.Height, PixelFormat32bppARGB); result.LockBits(R, ImageLockModeWrite or ImageLockModeUserInputBuf, PixelFormat32bppARGB, BitmapData); end;
// 2. BitmapÀÇ DIB value °ªÀ» º¹»çÇÏ¿© ³Ñ°Ü ÁÙ °æ¿ì { if Bmp.AlphaFormat = afPremultiplied then begin result := TGPBitmap.Create(Bmp.Width, Bmp.Height, PixelFormat32bppPARGB); result.LockBits(R, ImageLockModeWrite, PixelFormat32bppPARGB, BitmapData); end else begin result := TGPBitmap.Create(Bmp.Width, Bmp.Height, PixelFormat32bppARGB); result.LockBits(R, ImageLockModeWrite, PixelFormat32bppARGB, BitmapData); end; CopyMemory(BitmapData.Scan0, @srcdib[0], Bmp.Width * Bmp.Height * 4); }
result.UnlockBits(BitmapData); SetLength(srcdib, 0); end;
|