使用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!
而且我在游戏中使用正常大小而非固定大小的图片时,也感受出性能明显地提升了,于是我再次猜测,很可能是正常图片不需要压缩之类的运算,而把图片缩放需要进行运算,于是在每秒绘制几十次图片时,就会觉得性能感人。。。
以上,全属猜测。其中真正的原理还是要学习一下的。。。也希望能有大神给本小菜解释一下!
- 使用Graphics类的DrawImageUnscaled时的发现
- Graphics类和GraphicsPath类的使用
- C#之Graphics类的使用
- 使用Graphics 类绘图的基本步骤
- GDI+画图类Graphics的使用
- Graphics::DrawImage()函数的使用
- .NET Graphics.MeasureString 的使用
- AS3.0 Graphics 的使用
- PopUp和Graphics的使用
- 使用Java的Graphics类进行绘图的方法详解
- 使用Java的Graphics类进行绘图的方法详解
- 使用Graphics.DrawLine画线时,如何控制线的宽度!
- android.graphics包中的一些类的使用
- android.graphics包中的一些类的使用
- android.graphics包中的一些类的使用
- android.graphics包中的一些类的使用
- 使用dom4j时发现的一个问题
- Mutex对象使用时发现的问题
- codeforces 720 A. Closing ceremony
- Mybatis简介与原理
- 关于重绘(repaint)和回流(reflow)的理解
- c++中vector的用法详解
- Android布局管理器 - 详细解析布局实现
- 使用Graphics类的DrawImageUnscaled时的发现
- Android 的消息机制
- vim编辑器(二)
- 谷歌卫星地图下载器
- 【DSP开发】【并行计算-CUDA开发】TI OpenCL v01.01.xx
- 打印出如下图案(菱形)
- Android 常用方法xml大全
- POJ【4047】——Problem D. Garden 线段树
- nyoj67