【问题标题】:DIB to Tbitmap code manipulation to adapt PNG images?DIB 到 Tbitmap 代码操作以适应 PNG 图像?
【发布时间】:2012-01-07 21:51:45
【问题描述】:

我使用此代码将 DIB 转换为 TBitmap,那么如何操作此代码以适合 PNG 图像(保持其透明度)? 我厌倦了将透明属性设置为 true,但似乎代码是为 256 色位图制作的。

代码来源:Here

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

【问题讨论】:

    标签: delphi delphi-7 dib tpngimagelist tbitmap


    【解决方案1】:

    你可以看看PngComponentsPngFunctions.pas 单元包含将任何 TGraphic 转换为 png 图像的方法。当您使用TPngImagelist 标记您的问题时,您可能已经在使用这个库了。

    【讨论】:

    • 感谢 Uwe,但问题是当我从上面的代码中获取位图时,它是扭曲的(没有透明度)
    • 问题是我使用 SDK 旋转 png 图像,该 SDK 将图像输出为 DIB 句柄,但是当我保存它然后重新打开它时它工作正常.. 从 DIB 到位图的转换会扭曲透明度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2013-12-18
    • 2018-09-22
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    相关资源
    最近更新 更多