我正在尝试在VB6中开发OCR,我在BMP格式方面遇到了一些问题。我一直在研究OCR过程,第一步是用“阈值”转换“黑白”图像。转换过程很容易理解,我已经完成了。但是,我正在尝试减小结果图像的大小,因为它使用较少的颜色(每个像素在灰度级中只有256个可能的值)。在原始图像中我有3种颜色(红色,绿色和蓝色),但现在我只需要一种颜色(灰度值)。在这一刻,我已经实现了转换,但生成的灰度图像与原始彩色图像具有相同的大小(我在三个通道中分配了相同的颜色值)。
我试图修改BMP文件的标题,但我没有实现任何目标,现在我不明白它是如何工作的。例如,如果我使用paint转换图像,则标题中指定的偏移量会更改其值。如果标头是常量,为什么偏移会改变它的值?。
答案 0 :(得分:1)
问题是灰度位图图像与彩色位图图像的大小相同,因为用于保存灰色的数据占用的空间与颜色一样多。
唯一的区别是灰色只是相同值的3倍。 (160,160,160)
例如,颜色与(123,200,60)
类似。灰度值只是RGB场的一小部分。
例如,通过将其从24位转换为16位或8位,可以在转换为灰度后缩小尺寸。虽然这取决于您使用什么来进行转换,无论是否已经提供给您。否则你必须自己做。
您还可以尝试使用除BMP图像之外的其他内容。 PNG文件也是无损的,甚至可以节省24位版本的空间。图像处理库通常会为您提供多种输出格式选项。否则你可能会找到一个为你做这个的库。
答案 1 :(得分:0)
您可以使用“lockbits”方法编写自己的转换。理解如何正确锁定/解锁位需要一段时间,但努力是值得的,一旦您使用了代码,您将看到它如何应用于其他场景。例如,使用锁定/解锁位技术,您可以从位图访问像素值,将这些像素值复制到数组中,操作数组,然后将修改后的数组复制回位图。这比调用GetPixel()和SetPixel()要快得多。这仍然不是人们可以编写的最快的图像处理代码,但是实现和维护代码相对容易。
自从我编写VB6代码已经有一段时间了,但鲍勃鲍威尔经常有很好的例子,他有一个关于锁定位的页面:
http://www.bobpowell.net/lockingbits.htm
在紧要关头,您可以创建适当格式的新位图,并为每个像素调用SetPixel():