关于在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做的,但无论我如何设置,它总是以放大的形式出现在展示框中。

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


...全文
1264 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)
内容概要:本文探讨了将ChatGPT与工业领域结合的应用路径,提出通过将个人工作记录持续输入ChatGPT,将其培养成具备个体经验的工业AI助手。作者结合自身作为设备工程师的实际工作场景,开展实验验证:通过多次录入电机、轴承等设备的振动分析数据与诊断结论,测试ChatGPT在不同数据相似度下的响应表现。实验表明,当输入数据与历史记录高度一致时,ChatGPT能准确复现原有判断;随着工作记录积累越完整,其推理和关联能力越强,未来有望复制个人专业经验。文章强调,工业场景缺乏基础数据,难以直接用新技术解决老问题,因此“人即AI,AI即人”的渐进式融合路径更具可行性。 适合人群:从事工业设备管理、状态监测、故障诊断的工程师,以及关注AIGC在垂直行业落地的技术研究人员。 使用场景及目标:①构建基于个人经验的工业AI助手,辅助设备故障诊断决策;②探索大模型在数据稀缺工业场景下的可持续训练路径;③实现经验知识的数字化沉淀与智能复用。 阅读建议:此资源侧重于理念创新与实验验证,读者可借鉴其方法论,结合自身工作流持续输入专业数据,逐步训练专属工业AI助手,并在实践中评估其准确性与演化能力。
内容概要:本文围绕超导磁能储存系统的建模与仿真展开研究,重点基于Simulink平台构建系统动态模型,涵盖超导线圈的电磁特性、能量转换接口、冷却系统及其与电网的交互机制等关键环节。通过设置不同工况进行仿真分析,深入探究系统在电力网络中的动态响应行为、稳定性表现及能量存储效率,评估其在提升电网动态响应能力和运行稳定性方面的应用潜力。研究还结合先进控制策略(如模糊PID、遗传算法优化等),优化系统控制性能,进一步提升储能系统的调节精度与响应速度,为超导储能技术的实际工程应用提供理论依据与仿真验证支持。; 适合人群:具备电力系统、电气工程、自动化或相关专业背景,熟悉Simulink仿真环境与基本电力电子拓扑结构,从事科研、教学或工程开发的高年级本科生、研究生及科研技术人员。; 使用场景及目标:①用于高校科研教学中深入理解超导储能系统的工作原理与动态建模方法;②为电力系统仿真项目提供高保真度的储能单元建模参考;③支撑新型大容量储能系统的设计、控制策略开发与并网性能评估,目标是掌握超导磁能储存系统的全流程建模、仿真分析与控制优化方法。; 阅读建议:建议读者结合Simulink软件动手搭建系统模型,分模块实现超导线圈、变流器、冷却与控制单元,并逐步集成调试;重点关注系统在故障或负荷突变下的动态响应特性,尝试引入不同优化算法进行控制器参数整定,以深化对系统控制机理与性能边界的理解。

111,129

社区成员

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

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

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