游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3130|回复: 3

图象保存问题

[复制链接]

2

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2007-11-29 16:34:00 | 显示全部楼层 |阅读模式
程序模块如下:

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出现的问题

6

主题

32

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2007-12-25 11:32:00 | 显示全部楼层

Re:图象保存问题

不知道你搞定没有,我遇到过同样问题,我的做法是在初始化时加入了下面两行:
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
你试一试吧

6

主题

32

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2008-1-7 08:04:00 | 显示全部楼层

Re: 图象保存问题

有人问具体操作,加个例子。以Nehe的例子为基础,VC.图像格式为tga

sf_2008178349.zip

58.39 KB, 下载次数:

3

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2008-1-23 14:50:00 | 显示全部楼层

Re:图象保存问题

我也在研究这个问题,保存bmp可以,但是分辨率不够,不知道如何保存成任意分辨率的,可以在任意大的图纸上打印
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-19 21:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表