关于在DirectX下使用Sprite.Draw2D图像变形的问题请教

busymj 2008-07-29 11:35:15

我是在C#的环境下开发的,使用Managed DirectX 9.0c的SDK。

关于Draw2D的重载方式,不明白的可以见以下链接:
http://www.cnblogs.com/T-MAC/archive/2007/08/09/848793.html

下面是我输出的语句:

sprite.Draw2D(
Background1, //是一张800*600的图片,以Texture的形式加载入了D3D设备。
new Rectangle(0, 0, 1024, 768), //原图片裁剪,四个参数分别是(X、Y,宽,高)
new Rectangle(0, 0, 800, 600), //目标图片尺寸。
new Point(0, 0), //放入2D空间的坐标
Color.White //透明颜色
);


现在我遇到的问题是:无论如何设置,载入的图片总是变形的。

我的展示空间是800*600,屏幕分辨率是1024*768。
Background1载入的图片是以800*600做的,但无论我如何设置,它总是以放大的形式出现在展示框中。

请问我应该如何设置才能让这个图片保持原大?谢谢大家了。


...全文
1201 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
hztltgg 2008-07-30
  • 打赏
  • 举报
回复
那倒也可能,先扩大一下背景图为1024,右边下面留白就可以了吧
busymj 2008-07-30
  • 打赏
  • 举报
回复

原因找到了,原来D3D在上载纹理的时候,如果不指定,系统都会自动把图片大小改为2倍数的正方型。

比如,2*2,4*4,256*256,512*512,1024*1024.。。。。。

我原图是800*600的,于是就被改成了1024*1024。。。

所以大家在使用DirectX上传纹理的时候,尽量都使用2倍数的正方型。

我一会再想想办法。。。。

busymj 2008-07-30
  • 打赏
  • 举报
回复

那个不算解决啊,如果按上面那样解决的话,我要载入的时候就要知道图片的大小啊。

难道我要再用一个ImageLoader去建一个实例,然后取出大小来放到TextureLoader里?

不可能这么麻烦的吧。。。完全是画蛇添足。
yatobiaf 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 41417 的回复:]

图像变形还有什么其它解决方案吗?
[/Quote]
你不是说你解决了嘛
busymj 2008-07-30
  • 打赏
  • 举报
回复

图像变形还有什么其它解决方案吗?
sunrobust 2008-07-29
  • 打赏
  • 举报
回复
这个没问题
busymj 2008-07-29
  • 打赏
  • 举报
回复

是啊,我也发现了,所有的Draw2D范例在我的机子上都要改一下输出代码才能编译通过。

不知道是不是我的SDK有问题,我是用最新版(今年6月)的Managed DirectX 9.0C版本的SDK包。

DLL的版本使用的是“1.0.2902.0”版。
hztltgg 2008-07-29
  • 打赏
  • 举报
回复
既然原图是800*600的,为什么原图又裁剪为new Rectangle(0, 0, 1024, 768)?用new Rectangle(0, 0, 800, 600)是什么效果?

http://www.cnblogs.com/T-MAC/archive/2007/08/09/848793.html
这个上好像没有你写的Draw2D签名的方法呀
busymj 2008-07-29
  • 打赏
  • 举报
回复

刚才换了版本,方法不一致的问题解决了。

原来我想引用的几个库同一个版本兼容是否会好一些,于是3DX就选择了和DirectX同样的1.0.2902.0,
不曾想还会有这样的问题。倒唉~~

接口的问题是没有了,不过变形是依旧的,不知道会不会是我这台本本显卡的问题,一会我发个包到同事电脑上去试试。

谢谢大家了。

PS:最新带C#范例的是DirectX 9.0b的一个SDK。而且是For .Net1.1的,和9.0c接口完全不同,根本没办法用。
hztltgg 2008-07-29
  • 打赏
  • 举报
回复
是哦,初期简单的还行,深入就不行了,WPF或许应该考虑了
yatobiaf 2008-07-29
  • 打赏
  • 举报
回复
初学者搞DX没有帮助文件和教程怎么入手啊!!!我学了一段觉得好累就放弃了,呵呵
hztltgg 2008-07-29
  • 打赏
  • 举报
回复
我也很奇怪,以前的版本有.net的示例,现在的新的好像没有例子了,全是C++的。
busymj 2008-07-29
  • 打赏
  • 举报
回复

是的,但我所有的控件都是选择1.0.2902.0,
包括有可以选择多个版本的Direct3DX....
我换个版本试试,一会回来跟帖,谢谢了。
yatobiaf 2008-07-29
  • 打赏
  • 举报
回复
对了,我的SDK是March2008的,里面只有c++的帮助文件和例程,没有c#的,你们的版本里面有嘛?
hztltgg 2008-07-29
  • 打赏
  • 举报
回复
你下载的不是最新版的?
我的是directx_jun2008_redist.exe
hztltgg 2008-07-29
  • 打赏
  • 举报
回复
还真是有区别,我是 1.0.2902.0 到 1.0.2911.0 都有的

1.0.2907.0 和你一样,1.0.2908.0 到 1.0.2911.0 是我刚才的那种
busymj 2008-07-29
  • 打赏
  • 举报
回复

奇怪了,能帮看看您们用的Managed DirectX的版本是多少吗?

我的Sprite.Draw2D接口就是与你们的不一样~~#_#

谢谢了。
hztltgg 2008-07-29
  • 打赏
  • 举报
回复
我觉得 Background1 = TextureLoader.FromFile(Engine.device, FileName); 这个应该没错,可能还是绘图的地方有点问题。
这儿写了,和你错误的地方可能正好抵消,就正常了
busymj 2008-07-29
  • 打赏
  • 举报
回复

变形解决了,在载入纹理的时候。

Background1 = TextureLoader.FromFile(Engine.device, FileName);
//改成了
Background1 = TextureLoader.FromFile(Engine.device, FileName, 800, 600, 0, Usage.None, Format.A8B8G8R8, Pool.Default, Filter.None, Filter.None, 0);


在纹理中指定了图片的大小就解决了问题,但这样也太麻烦了,我在载入图片的时候怎么知道它的大小呢?

微软应该不会这么不人性化吧,本来大家按正常概念想都应该是OK的问题,到这里怎么会出现变形呢。

为什么会出现这样的问题?请教大家,谢谢了。
yatobiaf 2008-07-29
  • 打赏
  • 举报
回复
Specify System.Drawing.Rectangle.Empty to
use the entire source image for the sprite.

按照函数注释,用Rectangle.Empty的话应该是整张图片啊?
是第二个参数srcRectangle而不是第三个参数啊
要再不行试试改成 Rectangle(0, 0, 800, 600)
加载更多回复(7)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧