如果你曾经试图在Adobe Flex或Adobe Flash中使用很大的图像文件,可能已经遇到过这个问题。回到Flash Player 8/9,你不可能显示大于2880x2880像素的图像,现在,在Flash Player 10,你可以创建16769025像素BitmapData对象(不论是4095x4095,3353805x5,2048x8191,或任何其他组合,只要低于16769025像素)。这是对于用大图像工作是真正地得到了极大的改善,但是,如果你想要加载一张超过16769025像素的图像,或者如果你想缩放一个包含16769025像素的图像怎么办呢?
这里有一个窍门,你可以用大的图片浏览,放大,甚至与它们进行交互。注意的是这种方法只有对静态图像才行之有效。如果你试图让它动起来,计算量将极端地密集。
因此,我们已经了解了显示BitmapData对象的限制...你知道如何从一个URL加载超过16769025像素的大图像吗?但是实际上由于屏幕分辨率,图像不会显示,同样,即使你载入一个小于16769025像素的图像,拉伸/缩放图像超过16769025,那么它也不会显示在屏幕上。
如果您加载一个较大的图像,或拉伸图像超过16769025,只要你不将它添加至显示列表,你仍然可以执行图片的操作。例如,你仍然可以执行bitmapData.draw(source), 其中source源大于16769025像素,即使BitmapData对象本身小于16769025像素。通过篡改对象的bitmapData方式渲染对象,实际上你可能有其它渲染内容的想法是不可行的。你可以缩小图像,使整个内容得到展示,也可以放大图像,但只会显示图像的一部分,当放大时,没有限制,无论你放大到多少。你可以将4000x4000图像放大10倍(成为40000x40000可视对象),绘制它显示到屏幕可见区域。
在我们讨论工作原理前,先看看它的能力。下面你会看到一张4400x5800的屏幕截图,缩放它到很远。下面,你会发现一个互动的例子来测试图像,有放大缩小平移等动作。
代码
这里有一个窍门,你可以用大的图片浏览,放大,甚至与它们进行交互。注意的是这种方法只有对静态图像才行之有效。如果你试图让它动起来,计算量将极端地密集。
因此,我们已经了解了显示BitmapData对象的限制...你知道如何从一个URL加载超过16769025像素的大图像吗?但是实际上由于屏幕分辨率,图像不会显示,同样,即使你载入一个小于16769025像素的图像,拉伸/缩放图像超过16769025,那么它也不会显示在屏幕上。
如果您加载一个较大的图像,或拉伸图像超过16769025,只要你不将它添加至显示列表,你仍然可以执行图片的操作。例如,你仍然可以执行bitmapData.draw(source), 其中source源大于16769025像素,即使BitmapData对象本身小于16769025像素。通过篡改对象的bitmapData方式渲染对象,实际上你可能有其它渲染内容的想法是不可行的。你可以缩小图像,使整个内容得到展示,也可以放大图像,但只会显示图像的一部分,当放大时,没有限制,无论你放大到多少。你可以将4000x4000图像放大10倍(成为40000x40000可视对象),绘制它显示到屏幕可见区域。
在我们讨论工作原理前,先看看它的能力。下面你会看到一张4400x5800的屏幕截图,缩放它到很远。下面,你会发现一个互动的例子来测试图像,有放大缩小平移等动作。
当发生这种情况时,加载内容至mx:Image对象,但该对象从未添加到舞台,相反,在invalidateDisplayList()函数BigImage容器中,源图像内容渲染成为BitmapData对象,接着将它设置为另一个图像对象的源,获取后添加到显示列表。现在,你不能同时在大于16769025像素的图像上执行缩放scale和修剪crop(translate)操作。如果你想要显示超过16769025像素限制的内容,首先,你需要将要被缩放的BitmapData对象的从左上角0,0位置开始修剪成你期望的可见区域,修剪完成以后,你可以绘制渲染得到BitmapData对象,只要对象的尺寸不超过BitmapData的最大尺寸。Translation平移可以在bitmapData.draw操作时给出Matrix选项,利用scale选项可以完成缩放操作。

matrix.translate( translateX, translateY );
cropper.draw( sourceContent, matrix );
drawSource = new Bitmap( cropper );
scaleMatrix.scale( _scale, _scale );
finalBitmapData.draw( cropped, scaleMatrix, null, null, null, true );
drawSource = new Bitmap( finalBitmapData );
cropper.draw( sourceContent, matrix );
drawSource = new Bitmap( cropper );
scaleMatrix.scale( _scale, _scale );
finalBitmapData.draw( cropped, scaleMatrix, null, null, null, true );
drawSource = new Bitmap( finalBitmapData );
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述