|
|
程序模块如下:
Public Function SaveBMP_RP(FileName As String, X0 As Long, Y0 As Long, w As Long, h As Long) As Boolean
Dim infoHeader As BITMAPINFOHEADER, pixels() As Byte
Dim fileHeader As BITMAPFILEHEADER
Dim fn As Long, s As String
Dim i As Long, j As Long, n As Long
Dim tempRGB As Byte
Dim viewport(0 To 3) As Long, pad As Long
Dim Width As Long, ww As Long
On Error GoTo eh
glGetIntegerv GL_VIEWPORT, viewport(0) '得到当前的视口
Width = ((w - X0) * 3) ' 保存为24位位图,每个象素三个字节
pad = Width Mod 4
If pad Then pad = 4 - pad
Width = Width + pad
ReDim pixels(0 To Width * (h - Y0) - 1) '象素存储单元的大小
glPixelStorei GL_UNPACK_ALIGNMENT, 4 'glPixelStorei象素存储控制模式
glPixelStorei GL_UNPACK_SKIP_ROWS, 0
glPixelStorei GL_UNPACK_SKIP_PIXELS, 0
glPixelStorei GL_UNPACK_ROW_LENGTH, 0
'glReadPixels将象素的矩形阵列数据从帧缓存
'读出并存储到处理器内存中
glReadPixels X0, Y0, w, h, GL_RGB, GL_UNSIGNED_BYTE, pixels(0)
'BMP信息头申明
infoHeader.biSize = Len(infoHeader) '信息头大小
infoHeader.biPlanes = 1 '设备的位平面数
infoHeader.biBitCount = 24 '图像的颜色位数
infoHeader.biCompression = BI_RGB '图像的压缩方式,无压缩
infoHeader.biSizeImage = Width * Abs(h - Y0) '位图数据所占字节
infoHeader.biXPelsPerMeter = 0 '设备水平分辨率
infoHeader.biYPelsPerMeter = 0 '设备垂直分辨率
infoHeader.biClrUsed = 0 '使用的颜色数,2^24
infoHeader.biClrImportant = 0 '所有颜色都是重要的
infoHeader.biWidth = w - X0 ' '位图的宽度
infoHeader.biHeight = h - Y0 ' '位图的高度
s = Dir(FileName) '检测文件名是否存在
If Len(s) Then Kill FileName
'BMP文件头声明
fileHeader.bfSize = Len(fileHeader) '位图文件的大小
fileHeader.bfType = &H4D42 '位图文件的类型
fileHeader.bfReserved1 = 0 '保留部分一
fileHeader.bfReserved2 = 0 '保留部分二
fileHeader.bfOffBits = Len(fileHeader) + Len(infoHeader) '位图数据距离文件头的偏移字节数
For i = 0 To infoHeader.biSizeImage - 1 Step 3 '改变位图象素的颜色排序
tempRGB = pixels(i)
pixels(i) = pixels(i + 2)
pixels(i + 2) = tempRGB
Next i
fn = FreeFile '取得未使用的文件号
Open FileName For Binary As fn '打开文件保存位图
Put #fn, , fileHeader '位图文件文件头
Put #fn, , infoHeader '位图信息头
Put #fn, , pixels '位图数据
Close fn
SaveBMP_RP = True
Exit Function
eh:
Debug.Assert 0
Exit Function
Resume Next
End Function
然而这里会出现数据溢出:
For i = 0 To infoHeader.biSizeImage - 1 Step 3 '改变位图象素的颜色排序
tempRGB = pixels(i)
pixels(i) = pixels(i + 2)
pixels(i + 2) = tempRGB
Next i
如果把infoHeader.biSizeImage - 1改为infoHeader.biSizeImage-2,数据不显示溢出了,但是保存的图象
颜色严重变形.
求解决方法,谢谢
我是在VB里使用OPENGL出现的问题 |
|