Graphics 将32位Png转换为24位位图

Graphics 将32位Png转换为24位位图,graphics,vb6,imagemagick-convert,Graphics,Vb6,Imagemagick Convert,我要做的是在vb6控制台应用程序中以像素级处理下载的图像,以下是当前的步骤 我从一个网站下载了一个png文件,这是一个32位的图像,图像是灰度的,当图像是第一个 下载我需要将其转换为24位位图,以便能够处理它,如果我在Paint中打开图像并保存 它作为一个24位位图,我能够处理图像而不会出现问题,当保存在Paint中时,我会在保存时收到一条消息 表示“如果保存此图片,任何透明度都将丢失”。保存后,我将对文件进行二进制读取,然后提取 BITMAPFILEHEADER BitMapInfo头 BMP

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

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

BITMAPFILEHEADER
BitMapInfo头
BMPData

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

我曾尝试使用ImageMagick-6.9.0-Q16 ad和GraphicsMagick-1.3.21-Q8进行转换,但这些似乎会弄乱转换后的文件

有人知道他的名字吗

问候


Potman100

我尝试了我所知道的一切,让ImageMagick从灰度32位PNG文件创建24位彩色BMP,包括:

  • +matte
    删除alpha通道
  • -键入truecolor
    强制输出颜色
  • BMP4:output.bmp
    强制BMP4
  • BMP3:output.bmp
    强制BMP3
  • BMP2:output.bmp
    强制BMP2
  • -颜色16 | 256
    强制使用颜色数
  • -深度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
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
我不知道这对你是否有效,如果是,很好,到此为止。如果没有,请继续

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

convert yourImage.png output.ppm
这将得到一个
P6
类型
PPM
图像,如前所述。如果您想要更简单的ASCII P3版本,请使用以下命令

convert yourImage.png -compress none output.ppm
您的图像将如下所示:

convert input.png +matte -channel B -evaluate multiply 0.99 image.bmp
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

哇,谢谢你花了这么多时间和精力为我找到一个有效的解决方案, 我已经尝试过上面的方法,可能有效的方法是

转换yourImage.png-压缩none output.ppm

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

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

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

通过将tif文件加载到WIA.ImageFile并对其应用WIA.Vector,您可以 将图像中的像素相加,得到原始颜色值 按列排列,考虑到你们有一列都是白色的,这些只是 一个空白列可以为每个字符生成一个唯一的值

谢谢你的帮助


Potman 100

这没有多大意义。听起来像是一个普通的旧RGBA PNG,恰好使用了256个灰度。不知道这里为什么需要流对象,也不知道它给您带来了什么,因为您只需获取一个字节数组,并在需要的地方将其提供给WIA。但是你似乎在说你正在对图像执行一些手工编码的OCR操作来提取文本。这一定很慢,因为您将获得的向量格式提供了一个缓慢的变量长值集合,更不用说您的OCR代码了。我不知道TIF格式是如何在这些问题上发挥作用的。谢谢你的评论,我对图形编程/操作不是很在行,只是想找到一个可行的解决方案。我认为这可能有点慢,但目前解析字符需要大约1-2秒,如果我理解正确,您会建议从xmlhttp响应主体填充wia向量?当然。只需将.responseBody提取到动态字节数组中。然后将该数组分配给新空向量的.BinaryData。