将32位Png转换为24位位图

时间:2015-04-03 18:06:56

标签: graphics vb6 imagemagick-convert

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

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

  

BITMAPFILEHEADER
  BITMAPINFOHEADER
  BMPData

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

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

有人有任何想法吗?

此致

Potman100

2 个答案:

答案 0 :(得分: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。

<强>更新

我已经制定了一个可怕的黑客,它将使你成为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

答案 1 :(得分:0)

哇,谢谢你为我尝试找到合适的解决方案所花费的所有时间和精力, 我已经尝试了上述内容,可能是一个可行的

转换yourImage.png -compress none output.ppm

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

需要能够创建一个24位的位图是我正在做的项目的一部分,我得到的网站 png图像生成此图像,为我可能销售的商品提供£价格 他们,所以png将包含££(即1.56英镑),我希望能够解决这个问题 我编写的dos程序中的商品价值,因此可以从php调用。

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

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

感谢您的帮助。

Potman100