level 7
因为需要处理图像,直接绘制效率太低,所以想分析字节来处理,再者用控件也无法制作模块插件
区别于bmp文件结构,打印出字节发现和文件的有差异
PropertyBag不会改变图像结构字节吧?
Dim PBag As New PropertyBag
Dim B() As Byte
PBag.WriteProperty "Picture", Picture1.Picture
B = PBag.Contents
Debug.Print "byte:" & UBound(B)
For i = 0 To UBound(B)
Debug.Print Hex(B(i))
Next
2018年07月22日 08点07分
1
level 10
研究过一点儿propertybag,但是没弄明白,首先propertybag保存的一定是完整的数据并可以保证原样反序列,但具体的存储结构可能就有些鬼畜了。一般这种需求我是用gdi+,gdi+可以通过byte数组创建位图并获取或指定每个像素点的argb,相当于直接操作内存,效率也会比vb自带的pset高~
2018年07月22日 14点07分
2
但是以前试用过GDI+,慢到吐血,不知道是不是我食用姿势不对?
2018年07月23日 03点07分
@冰之源___ 不能一概而论,gdi+有一些方法很慢,但是图片设置颜色值这个其实是改变数组元素值,跟gdi+没啥关系,gdi+只是负责把数组作为它的bitmap对象并画出来~
2018年07月23日 05点07分
GDI+有其他开销吧?虽然说效率都在能接受范围内,不过目前处理bmp文件思路清晰觉得可行,请问知道怎么一次性从图像字节中读取type吗?见楼下
2018年07月23日 10点07分
level 11
Propertybag是用来保存属性值的,不能用来保存内容
2018年07月23日 03点07分
4
level 7
没有去深入了解GDI+,我现在的需求主要下面几个:
能够拼接两幅图像,如:20x20两张拼接成40x20或20x40
转换灰度图,二值化
边缘查找,形状查找,色块查找
缩放:临近,双线插值
简便的操作方式是不是直接分析图像结构自己写算法比较好?
PBag中的格式具体怎样不重要了我只提取部分有用的,除了头信息有部分差异,位图点阵数据差不多
现在我参照网上例子BMP文件头结构体Type
Public Type BitMapFileHeader
bfType As Integer '文件类型,BM,Int=19778
bfSize As Long '文件大小
bfreserved1 As Integer '保留,0
bfreserved2 As Integer '保留,0
bfOffBits As Long '数据偏移量
End Type
'位图信息头
Public Type BitMapInfoHeader
biSize As Long '信息头长度,InfoSize,24位BMP是28
biWidth As Long '位图宽度
biHeight As Long '位图高度'通常情况是倒向位图,如果该值为负,则是正向位图,少用,注意兼容
biPlanes As Integer '表示bmp图片的平面属,显然显示器只有一个平面,所以恒等于1
biBitCount As Integer '位深,说明比特数/象素,其值为1、4、8、16、24、或32。Hex(18)=24位
biCompression As Long '压缩类型,BI_RGB=0=没有压缩,BI_RLE8,BI_RLE4,BI_BITFIELDS,BI_JPEG:JPEG格式
biSizeImage As Long '用字节数表示的位图数据的大小。该数必须是4的倍数
biXPelsPerMeter As Long '用像素/米表示的水平分辨率
biYPelsPerMeter As Long '用像素/米表示的垂直分辨率
biClrUsed As Long '颜色索引数(设为0的话,则说明使用所有的调色板项)
biClrImportant As Long '对图像显示有重要影响的颜色索引的数目,如果是0,表示都重要
End Type
'调色板
Public Type RGBquad
rgbBlue As Byte 'Blue
rgbGreen As Byte 'Green
rgbRed As Byte 'Red
rgbReserved As Byte '保留,为0
End Type
Public bf As BitMapFileHeader
Public bl As BitMapInfoHeader
Open CommonDialog1.filename For Binary As #1
Get #1, , bf
Get #1, , bl
Debug.Print "---------------------------------------------Open"
Debug.Print "类型:" & bf.bfType
Debug.Print "大小:" & bf.bfSize
Debug.Print "偏移:" & bf.bfOffBits
Debug.Print "信息头长:" & bl.biSize
Debug.Print "宽度:" & bl.biWidth
Debug.Print "高度:" & bl.biHeight
Debug.Print "位深:" & bl.biBitCount
Debug.Print "压缩:" & bl.biCompression
Debug.Print "数据位数:" & bl.biSizeImage
以上代码需要读取文件,我想从内存变量b() as byte 中读取type结构
如何从Byte()中一次读取进去
就像Open中的Get方法一样
2018年07月23日 10点07分
5
level 7
调试输出
类型:19778
大小:294936
偏移:54
信息头长:40
宽度:258
高度:380
位深:24
压缩:0
数据位数:294882
2018年07月23日 10点07分
6
level 10
vb确实没有提供靠譜的字节数组与图片互转的方法,所以这些需求我目前只能想到gdi+,gdi+确实有提供绘制字节数组图片的方法,而且这个字节数组就是颜色矩阵。目测楼主是图像处理大神,所以自己写算法确实来的实在,但在vb中不推荐这样做,因为语言本身速度制约,首先在vb中遍历一个128*128的二维数组就已经能感受到延迟了,所以对于缩放等基本操作在vb中能用库或者api就尽量使用他们,(gdi+就提供了相关的方法),毕竟它们往往都是用c实现的,而对于二值化、边缘检测等就只能自己手写算法了
2018年07月23日 14点07分
7