DIB to Tbitmap манипулирование кодом для адаптации изображений PNG? - PullRequest
3 голосов
/ 28 ноября 2011

Я использую этот код для преобразования 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

1 Ответ

1 голос
/ 28 ноября 2011

Вы можете взглянуть на PngComponents .Модуль PngFunctions.pas содержит метод для преобразования любого TGraphic в изображение PNG.Поскольку вы пометили свой вопрос TPngImagelist, вы, вероятно, уже используете эту библиотеку.

...