我正在为自己创建一个程序,可以打开未排列的精灵表,根据XML文件排列它们,然后将它们保存为PNG。它的作用是加载未排列的工作表并将其放入BitmapData
,然后根据特定的XML文件,它抓取工作表上的每个框架(使用BitmapData.copypixels()
),并添加结果{{1按顺序到一个数组。然后通过将这些Bitmap
添加到Bitmap
对象来排列它们,从而相应地创建新行。从本质上讲,我最终得到的是Sprite
包含Sprite
,其中包含了我想要的内容。
现在我通常在这里做的是使用Bitmaps
将Sprite
绘制到BitmapData
,这有效,然后我继续将其编码为PNG并保存。这一切都有效,除了一个案例。
有时候,我会从多个无组织的spritesheet中制作一个spritesheet,这会产生相当大的工作表。在一种情况下,这个结果表非常大,由于某种原因,我想要绘制的BitmapData.draw()
不会接受那么大。也就是说,我创建了一个新的BitmapData
,其维度等于BitmapData
,但是当我尝试这样做时,我收到此错误:
Sprite
据我所知,只有当我ArgumentError: Error #2015: Invalid BitmapData.
的宽度和/或高度为0,或者如果我超过最大尺寸时,才会发生这种情况。如果不是因为Flash 11和AIR 3没有限制,我认为这是后者。
无论如何我还没有找到出路,所以基本上这是我的问题:有没有办法以不同的方式做到这一点?例如,我可以在不BitmapData
的情况下获取Sprite
的像素数据吗?或者,我可以以某种方式将数据存储在BitmapData
中,而无需为其提供与图像相同的尺寸吗?或者有完全不同的方法吗?
我意识到我可以将图像分成两个单独的BitmapData
,但我想知道在采用这个之前是否有替代方案。
顺便说一下,如果重要的话,它是使用FlashDevelop和Flex 4 SDK制作的Adobe AIR应用程序。我正在使用PNGEncoder2对我保存的最终精灵表进行编码。
编辑:我发现问题似乎是我的电脑根本无法处理所需大小的BitmapData
。我尝试将其拆分为两个单独的BitmapData
,但不幸的是,在创建第二个BitmapData
时,我收到了同样的错误。因此,似乎数据量不能同时包含在我的PC内存中BitmapData
。不幸的是,这意味着我甚至无法使用g10的解决方案,使用他链接到的PNG编码器将两个BitmapData
合并到一个PNG中。
到目前为止,我的解决方案是将图像的一半绘制成BitmapDatas
,对其进行编码,然后BitmapData
dispose()
并将后半部分存储在其中并对其进行编码。然后我将BitmapData
(这是编码的结果)保存为单独的图像,我可以使用外部程序将其重建为一个。
所以现在,我的问题是“我可以以某种方式将其保存为单个PNG”,而不是“我可以将其作为单个ByteArrays
”。
答案 0 :(得分:2)
我也遇到了这个问题,发现有19,000 x 19,000像素的限制。这是在带有Flash Player 11.3的Windows 7上,当然Flash Player 10有更低的限制,请查看page for the details。
这是我用于测试的代码:
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.StageAlign;
public class PNGTest extends Sprite
{
static var IMAGE_DIM = 18000;
public function PNGTest()
{
this.stage.align = StageAlign.TOP_LEFT;
var bmData = new BitmapData(IMAGE_DIM, IMAGE_DIM, false, 0xFF0000);
var image:Bitmap = new Bitmap(bmData);
this.addChild(image);
}
}
}
如果您需要的图片大于您要定位的Flash Player版本所支持的图片,只需将图片拆分即可。您也可以将图像数据复制到ByteArray中,不知道它的最大大小。有关示例代码,请参阅How to convert bytearray to image or image to bytearray?。
答案 1 :(得分:1)
从inspirit.ru检查异步PNGencoder:http://blog.inspirit.ru/?p=378
提供了PNGencoder.swc和用法示例
对图像大小没有限制,只需要一些时间进行编码(可以显示进度条)。
编辑:
BitmapData对象的尺寸(像素数量)有一个上限,但PNG没有,请检查http://code.google.com/p/in-spirit/wiki/PNGEncoder的使用信息,尤其是getNextBitmapsRow回调
特别针对您的情况,这个PNGEncoder不是在一个大的BitmapData对象中绘制您的Sprite,而是允许您在几个小的BitmapData对象中拆分大的Sprite(例如,从35,000 x 60,000像素的Sprite中可以制作35列x 60行= 2100个1000x1000像素的BitmapData对象),它使用回调机制:创建并传递第一个BitmapData对象,lib对其进行编码,并在完成时调用回调,此时您创建并传递下一个BitmapData编码。