【问题标题】:Drawing on 4-bit indexed images in GDI+在 GDI+ 中绘制 4 位索引图像
【发布时间】:2012-03-31 22:33:00
【问题描述】:

我正在尝试在 4 位索引位图上使用 GDI+ api 绘制一些基本的图形基元(线、矩形等)。我正在使用 Bitmap() 函数来创建位图和加载位图。

Bitmap myBitmap(100/*width*/,100/*height*/,PixelFormat4bppIndexed/*Pixel format*/);
Graphics graphics(&myBitmap);
SolidBrush brush(Color(255,128,0,0));
graphics.FillRectangle(&brush,0,0,100,100);

但这不起作用(没有创建矩形)。 可能是什么问题呢?我尝试手动使用 LockBits 并手动修改位,效果很好,那么为什么它不适用于 Graphics gdi+ 操作。

【问题讨论】:

  • 不应该先创建调色板吗?
  • > 但这不起作用(没有创建矩形)。它不会抛出异常吗?
  • 不要忽略函数返回值。您无法完成这项工作,不支持绘制到具有索引颜色格式的位图中。
  • 当我们以这种方式创建位图对象时,它默认选择了调​​色板。我们也可以获取并检查该调色板。我创建了具有相同颜色的 Pen 对象,这些颜色在 Bitmap 对象的调色板中可用,但它不起作用,即使它没有返回任何错误。我通过创建 4 位位图并手动设置调色板,然后使用普通 GDI 函数绘制来尝试在 GDI 中使用 DIB。它工作顺利。
  • 而且更令人惊讶的是,当我尝试从 4bppIndexed Bitmap 获取 HBITMAP 时,它返回一个 32 位 HBITMAP(使用 GetObject 检查),如果我锁定 4bppIndexed Bitmap 的位并根据 4bpp 进行修改,它有效。

标签: windows visual-c++ gdi+


【解决方案1】:

最后我设法解决了我的问题。要在 4 位索引位图上使用 Graphics 对象执行 gdi+ 操作,我们需要执行以下步骤。

  1. 直接创建 4bpp HBITMAP 或使用 LoadImage 从文件加载图像。
  2. 如果从 4bpp 文件加载,则从 HPALETTE 对象中的文件加载调色板。
  3. 创建与桌面兼容的 dc。
  4. 在新创建的 dc 中选择并实现您的调色板。
  5. 在您的 dc 中选择 HBITMAP。
  6. 使用您的 dc 创建 Graphics 对象。
  7. 在 4bpp 索引上执行 GDI+ 操作。

虽然我没有尝试使用 8bpp,但我认为类似的操作也可以在 8bpp 上执行。

希望这对其他人也有帮助。

【讨论】:

    猜你喜欢
    • 2014-08-01
    • 2014-01-15
    • 2021-11-09
    • 1970-01-01
    • 2010-09-16
    • 2022-08-17
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多