【问题标题】:Convert a 32Bit Png to a 24bit Bitmap将 32 位 Png 转换为 24 位位图
【发布时间】:2015-04-03 18:06:55
【问题描述】:

我正在尝试做的是在 vb6 控制台应用程序中以像素级别处理下载的图像,这些是当前的步骤

我从一个网站下载了一个 png 文件,这是一个 32 位图像,图像是灰度的,当图像是第一个时 下载我需要将其转换为 24 位位图以便能够处理它,如果我在 Paint 中打开图像并保存 它作为 24 位位图我能够毫无问题地处理图像,当保存在 Paint 中时,我会在保存时收到一条消息 说“如果保存这张图片,任何透明度都会丢失。”,保存后,我对文件进行二进制读取,然后提取

位图文件头
BITMAPINFOHEDER
BMP数据

然后我可以遍历 BMPData 并提取和处理所需的值。如果我尝试加载图像而不先保存 它在绘画中的 24 位位图,我在 VB 中收到一个内存不足错误(运行时错误 7)并且 BMPInfoHeader.biSizeImage 是 与通过绘画保存后的尺寸相比非常大。

我曾尝试使用 ImageMagick-6.9.0-Q16 广告和 GraphicsMagick-1.3.21-Q8 进行转换,但这些似乎只是弄乱了转换后的文件。

有人知道吗?

问候

Potman100

【问题讨论】:

    标签: graphics vb6 imagemagick-convert


    【解决方案1】:

    我已尽我所能让 ImageMagick 从灰度 32 位 PNG 文件创建 24 位彩色 BMP,包括:

    • +matte 移除 alpha 通道
    • -type truecolor 强制输出颜色
    • BMP4:output.bmp 强制使用 BMP4
    • BMP3:output.bmp 强制使用 BMP3
    • BMP2:output.bmp 强制使用 BMP2
    • -colors 16|256 强制颜色数量
    • -depth 8|24设置位深
    • 通过 PPM 格式并返回以摆脱 PNG 设置
    • 通过 NetPBM 的 ppm2bmp/ppmtobmp 写作

    一切都无济于事。我无法让 ImageMagick 从灰色的 32 位 PNG 创建 24 位彩色 BMP。

    更新

    我已经制定了一个可怕的 hack,可以让你成为 24 位 BMP,如下所示。在灰度图像中,每个像素的红=绿=蓝强度。如果我们决定将每个蓝色像素乘以 0.99,那么只有 1% 的误差,蓝色像素将小于红色和绿色,因此 ImageMagick 将根本无法使用灰度图像将 BMP 保存在...像这样:

    convert input.png +matte -channel B -evaluate multiply 0.99 image.bmp
    

    我不知道这是否对你有用,如果是这样,很好,到此为止。如果没有,请继续...

    我唯一能建议的是你使用PPM 格式,它比 BMP 更容易让你阅读

    convert yourImage.png output.ppm
    

    这将为您提供P6 类型PPM 图像,如here 所述。如果您想要更简单的 ASCII P3 版本,请使用此命令

    convert yourImage.png -compress none output.ppm
    

    您的图像将如下所示:

    P3
    384 128
    255
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255
    

    【讨论】:

      【解决方案2】:

      哇,感谢您为尝试为我找到可行的解决方案所花费的所有时间和精力, 我已经尝试了上述方法,可能可行的方法是

      转换 yourImage.png -compress none output.ppm

      我必须做一些进一步的测试来检查这些值,但我认为它会起作用。

      需要能够创建 24 位位图是我正在做的项目的一部分,我得到的网站 来自的 png 图像生成此图像以提供我可能出售给的物品的 £ 价格 它们,所以 png 将包含一个 £ 值(即 £ 1.56),我希望能够计算出 我写的一个dos程序中offer的值,所以可以从php中调用。

      我确实找到了一种方法,我使用 xmlhttp 通过 adodb 流下载图像并找到 我可以将图像保存为 bmp 以外的多种不同格式,所以我看了 在不同的图像格式的格式,发现tif文件格式看起来很有前途 并在网上找到了一些使用Microsoft Image Acquistion Library来操作tif的代码 文件。

      通过将 tif 文件加载到 WIA.ImageFile 并对其应用 WIA.Vector,您可以 通过将值相加来迭代图像中的像素并获取原始颜色值 按列并考虑到您的列都是白色的,这些只是 一个空白列,我能够为每个字符生成一个唯一值。

      感谢您的所有帮助。

      Potman100

      【讨论】:

      • 这没有多大意义。听起来您有一个普通的旧 RGBA PNG,恰好使用 256 种灰度。不知道为什么在这里需要一个 Stream 对象或者它给你带来了什么,因为你可以只获取一个字节数组并在需要的地方将它输入到 WIA 中。但是,您似乎是在说您正在对图像执行一些手动编码的 OCR 操作以提取文本。这一定很慢,因为您将获得的 Vector 格式提供了一个缓慢的 Variant Long 值集合,更不用说您的 OCR 代码了。不知道 TIF 格式如何发挥作用。
      • 感谢您的评论,我并不真正从事图形编程/操作,只是想获得一个可行的解决方案。我接受它可能有点慢,但目前大约需要 1-2 秒来解决字符,
      • 如果我理解你的正确理解,你会建议从 xmlhttp 响应正文中填充一个 wia 向量?
      • 当然。只需将 .responseBody 获取到动态字节数组中。然后将该数组分配给新的空向量的 .BinaryData。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 2019-02-17
      • 2016-07-27
      • 2013-04-22
      • 1970-01-01
      • 2012-08-22
      相关资源
      最近更新 更多