使用Graphics类的DrawImageUnscaled时的发现

来源:互联网 发布:电视直播软件安装包 编辑:程序博客网 时间:2024/06/03 09:34

最近在写一个小RPG游戏引擎,在切分帧序列图片时碰到了一个很奇怪的问题:有的图片可以很完整地截取,然而有些图片却总是切不完整。一开始我反复地检查,确保每个小图的尺寸没有算错,但依然存在这个问题。还有一个更奇怪的问题,就是在绘制游戏地表时,使用某些图片会相当卡,CPU占用率相当高。于是我把这个问题单独拎出来研究了一下,最终解决了!现在我来浅谈这个问题。

首先来看看这个函数:


使用DrawImageUnscaled函数要求我们指定一个位置,一张图片(需要切分的“大图”)。其实还需要指定一个切图的尺寸,但由于这个函数是通过Graphics 实例绘制图片,因此这个大小应该由实例指定,我在程序中是这样使用的:

Bitmap img = new Bitmap(width, height);Graphics g = Graphics.FromImage(img);g.DrawImageUnscaled(operatingImage, -j * width, -i * height);

这样,被切分出来的图片就会保存在img里(width和height分别为要切分出来的图片的物理尺寸,这个尺寸可以在图片文件的属性中查看到)

先来看看直接这样使用函数的结果:



右图为原图,左图为被切出的图片(切了很多,这只是其中一张)。可以看到,这个图片被放大了,而且切得很不完整。。。

       一脸懵逼的我去百度了下,各种结果都不尽人意,我甚至企图翻墙上谷歌,但就在这时,我随便翻了翻Image的成员表,眼神无意间在这么几个属性上驻留:


       我突然联想到,平时我们玩游戏时,在退出全屏模式后,有时分辨率会变不回来,导致桌面比例很不协调,看起来很丑(图标非常大)。于是我猜测,可能是因为图片的物理尺寸是一定的,但是我们的显示器分辨率不唯一,在高分辨率下,正常的图片很可能被同比例放大,所以我们用物理尺寸大小的矩形去截取图片,可能会不完整!于是本着试一试的态度使用了这几个属性:


 

       后面的96是我试出来的值,这样截出来的图比较完整,当然,这么有什么理论依据。。。

       于是我又试了下,截出来的图是这样的:

 

       完美!!!exciting!

       而且我在游戏中使用正常大小而非固定大小的图片时,也感受出性能明显地提升了,于是我再次猜测,很可能是正常图片不需要压缩之类的运算,而把图片缩放需要进行运算,于是在每秒绘制几十次图片时,就会觉得性能感人。。。

       以上,全属猜测。其中真正的原理还是要学习一下的。。。也希望能有大神给本小菜解释一下!


1 0