このコードを使用して DIB を TBitmap に変換しますが、このコードを PNG 画像に適したものにするにはどうすればよいでしょうか (透過性を維持します)。Transparent プロパティを true に設定するのに疲れましたが、コードは 256 色のビットマップ用に作成されたようです。
コードソース:こちら
VAR
BitCount : INTEGER;
BitmapFileHeader: TBitmapFileHeader;
BitmapInfo : pBitmapInfo;
DIBinMemory : Pointer;
MemoryStream : TMemoryStream;
NumberOfColors : INTEGER;
BEGIN
RESULT := TBitmap.Create;
DIBinMemory := GlobalLock(hDIB);
TRY
BitmapInfo := DIBInMemory;
NumberOfColors := BitmapInfo.bmiHeader.biClrUsed;
BitCount := BitmapInfo.bmiHeader.biBitCount;
IF (NumberOfColors = 0) AND (BitCount <= 8)
THEN NumberOfColors := 1 SHL BitCount;
WITH BitmapFileHeader DO
BEGIN
bfType := $4D42; // 'BM'
bfReserved1 := 0;
bfReserved2 := 0;
bfOffBits := SizeOf(TBitmapFileHeader) +
SizeOf(TBitmapInfoHeader) +
NumberOfColors*SizeOf(TRGBQuad);
bfSize := bfOffBits + BitmapInfo.bmiHeader.biSizeImage;
END;
MemoryStream := TMemoryStream.Create;
TRY
MemoryStream.Write(BitmapFileHeader, SizeOf(TBitmapFileHeader));
MemoryStream.Write(DIBInMemory^,
BitmapFileHeader.bfSize - SizeOf(TBitmapFileHeader));
MemoryStream.Position := 0;
RESULT.LoadFromStream(MemoryStream)
FINALLY
MemoryStream.Free
END
FINALLY
GlobalUnlock(hDIB);
GlobalFree(hDIB)
END