VB 如何读取bmp文件每一个像素点的RGB值,然后处理后再写回更新图像
我想将一副超大的bmp图像,比如15000*15000读入byte数组中,方法如下:PrivatebfHeaderAsBITMAPFILEHEADER'BMP文件头Pri...
我想将一副超大的bmp图像,比如15000*15000读入byte数组中,方法如下:
Private bfHeader As BITMAPFILEHEADER 'BMP文件头
Private biHeader As BITMAPINFOHEADER 'BMP文件信息头
Private Const BMP_MAGIC_COOKIE As Integer = 19778 '文件类型
Open “C:\Test.bmp” For Binary Access Read As #Fn
Get fn, , bfHeader
Get fn, , biHeader
Bi= biHeader.biBitCount 'bmp的位数,这里是8位
bmWidth = biHeader.biWidth
bmHeight = biHeader.biHeight
On Error Resume Next
ReDim bmArray(bmWidth * 3 - 1, bmHeight - 1) As Byte '将bmp图像的每一个像素点的rgb值读入byte数组bmArray中,但由于数组太大,内存溢出,无法读取。
因此,想到如下方法:
FileLen=Lof(Fn)
Dim Buff( ) as byte
Open “C:\Test.tmp” For Binary Access Read As #2
'写入BMP的文件头信息
Put #2, , bfHeader
Put #2, , biHeader
For I=bfHeader.bfOffBits + 1 to FileLen step n
Seek Fn, i '读取每一个像素点rgb值的起点
Get Fn, , Buff '将每一个像素点rgb值读入数组
PexilValue= StrConv( Buff, vbFromUnicode)'将二进制数据转换为人可识别的数字
'下面将PexilValue 分拆出R、G、B值
'对分拆出来的R、G、B值进行特定运算后,更新RGB,更新Buff值
Seek #2,i '设置临时文件的写入点
Put #22, , Buff '将更新处理后的像素值写入临时文件
next
Close #22
'将临时文件 C:\Test.tmp”更名为 C:\Out.bmp,这样,大功告成。
我的问题是:这里的buff()数组如何定义? PexilValue值如何换取和转换为rgb值?转换后更新后的rgb值如何改写buff? 展开
Private bfHeader As BITMAPFILEHEADER 'BMP文件头
Private biHeader As BITMAPINFOHEADER 'BMP文件信息头
Private Const BMP_MAGIC_COOKIE As Integer = 19778 '文件类型
Open “C:\Test.bmp” For Binary Access Read As #Fn
Get fn, , bfHeader
Get fn, , biHeader
Bi= biHeader.biBitCount 'bmp的位数,这里是8位
bmWidth = biHeader.biWidth
bmHeight = biHeader.biHeight
On Error Resume Next
ReDim bmArray(bmWidth * 3 - 1, bmHeight - 1) As Byte '将bmp图像的每一个像素点的rgb值读入byte数组bmArray中,但由于数组太大,内存溢出,无法读取。
因此,想到如下方法:
FileLen=Lof(Fn)
Dim Buff( ) as byte
Open “C:\Test.tmp” For Binary Access Read As #2
'写入BMP的文件头信息
Put #2, , bfHeader
Put #2, , biHeader
For I=bfHeader.bfOffBits + 1 to FileLen step n
Seek Fn, i '读取每一个像素点rgb值的起点
Get Fn, , Buff '将每一个像素点rgb值读入数组
PexilValue= StrConv( Buff, vbFromUnicode)'将二进制数据转换为人可识别的数字
'下面将PexilValue 分拆出R、G、B值
'对分拆出来的R、G、B值进行特定运算后,更新RGB,更新Buff值
Seek #2,i '设置临时文件的写入点
Put #22, , Buff '将更新处理后的像素值写入临时文件
next
Close #22
'将临时文件 C:\Test.tmp”更名为 C:\Out.bmp,这样,大功告成。
我的问题是:这里的buff()数组如何定义? PexilValue值如何换取和转换为rgb值?转换后更新后的rgb值如何改写buff? 展开
展开全部
记得以前使用API函数做过,程序应该不是很复杂,时间长了,记不得了,你可以有API函数可能会简单一点吧?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
必须寻找其他替代办法,用数组读入内存处理是不行的。
很遗憾,我能确定不行,但不知道怎样才能行。
很遗憾,我能确定不行,但不知道怎样才能行。
追问
图像太大,一次性读入内存数组中处理不行,但分块分次读入再处理,可以!
追答
这个问题仔细研究起来是挺复杂的,要由具体的操作决定。
比如说,如果是简单的颜色处理(取反,调整灰度之类的),那完全可以不要BUFF,直接通过文件操作取了数据转换一下直接存盘就行了。也可以认为BUFF就是一个字节。
但如果是图像识别,那就麻烦了。你不读入足够大面积的图像,连文字边界都识别不出来。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询