游戏开发论坛

 找回密码
 立即注册
搜索
查看: 12720|回复: 33

怎样读取资源包内图片到DDRAW表面?

[复制链接]

22

主题

128

帖子

134

积分

注册会员

Rank: 2

积分
134
发表于 2007-4-11 16:57:00 | 显示全部楼层 |阅读模式
研究了研究
CreateTextureFromFileInMemoryEX
这个已经会用了,就是用二进制方式读取文件数据到一个Byte数组,然后再把数组的第一个元素作为第2个参数,把数据的长度作为第三个参数就可以了

但是怎样用这种方法创建Surface7?我实在搞不明白了,望大大们提示下,谢了

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-4-11 17:03:00 | 显示全部楼层

Re:怎样读取资源包内图片到DDRAW表面?

新版本Dx8和Dx9中,创建出来的Texture,可以使用GetSurfaceLevel(0,Surf)来获取D3DSurface
但是DX7就不知道有米有这个函数了

DX7的做法一般是用DC读取,然后通过DC转到Surface

0

主题

85

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2007-4-11 19:26:00 | 显示全部楼层

Re:怎样读取资源包内图片到DDRAW表面?

为什么surface还要带个7?到底是用DDraw还是D3d,我都糊涂了。

22

主题

128

帖子

134

积分

注册会员

Rank: 2

积分
134
 楼主| 发表于 2007-4-11 19:55:00 | 显示全部楼层

Re:怎样读取资源包内图片到DDRAW表面?

带个7当然就是DDRAW了

noslopforever兄
请问,用二进制的方式读取图片到一个Byte数组后,怎样用他创建一个DC?

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2007-4-11 20:22:00 | 显示全部楼层

Re:怎样读取资源包内图片到DDRAW表面?

CreateDIBSection

不过只能读取BMP格式的。

15

主题

97

帖子

104

积分

注册会员

Rank: 2

积分
104
发表于 2007-4-11 21:16:00 | 显示全部楼层

Re:怎样读取资源包内图片到DDRAW表面?

http://www.vbgamedev.com/OTHER/res.HTM

22

主题

128

帖子

134

积分

注册会员

Rank: 2

积分
134
 楼主| 发表于 2007-4-11 22:24:00 | 显示全部楼层

Re:怎样读取资源包内图片到DDRAW表面?

首先感谢以上兄弟的帮助,谢谢

使用资源编辑器不适合大量分类的资源图片

sandy_zc_1 兄,您能不能给段代码?假设位图文件已经用二进制方式读入一个Byte数组,怎样用它创建Surface7?我找了半天实在是找不到办法了

15

主题

2093

帖子

2093

积分

金牌会员

Rank: 6Rank: 6

积分
2093
发表于 2007-4-11 22:43:00 | 显示全部楼层

Re:怎样读取资源包内图片到DDRAW表面?

数组第一个元素的地址就是数组中数据的首地址

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2007-4-12 13:52:00 | 显示全部楼层

Re:怎样读取资源包内图片到DDRAW表面?

呃,这个也挺麻烦的,如果你对GDI没有太多了解的话。
不过当你搞明白之后也是非常简单的。

( 加个关键词: 读取 图片 BMP 内存 资源包 )

首先需要了解一下BMP的文件结构。
其实标准的BMP文件就是将DIB信息原原本本地保存到文件而已,所以可以轻松将它读入内存然后创建DIB。

DIB是“设备无关位图”的缩写,Win32平台里面大都使用这种位图。

BMP文件的结构是首先是一个BITMAPFILEHEADER类型的UDT作为头部,然后跟一个完整的DIB。

如果图简单的话,直接将BMP文件的头部那一段去掉,然后将后面的作为DIB拷贝到内存中就OK了。

GDI使用CreateDIBSection来创建DIB位图:

Declare Function CreateDIBSection Lib "gdi32" (ByVal hdc As Long, _
                                                      pBitmapInfo As BITMAPINFO, _
                                                      ByVal un As Long, _
                                                      lplpVoid As Long, _
                                                      ByVal handle As Long, _
                                                      ByVal dw As Long) As Long

其中hdc参数要传递和你想创建的设备环境相同的一个设备DC,pBitmapInfo参数是DIB的描述,un参数指定是RGB模式(为0)还是PAL模式(为1),lplpVoid这个参数最重要,系统会把创建完成的DIB内存地址通过它返回给你,最后handle和dw参数是和文件映射有关的,一般传0就可以了。

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2007-4-12 13:55:00 | 显示全部楼层

Re:怎样读取资源包内图片到DDRAW表面?

当你使用CreateDIBSection创建一个DIB之后,它会返回一个值,如果是0的话表明创建失败,如果非零就是这个DIB的handle属性。

之后你需要将BMP文件中的数据拷贝到lplpVoid参数所指的内存中。

然后调用SelectObject将它选进一个设备就OK了。


(选进一个DC后就不用我说了吧,之后你怎么Blt都可以。)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 17:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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