1

我正在为自己制作一个程序,它可以打开未排列的精灵表,根据 XML 文件排列它们,然后将它们保存为 PNG。它的作用是加载未排列的工作表并将其放入 a 中BitmapData,然后根据特定的 XML 文件抓取工作表上的每一帧(使用BitmapData.copypixels()),并将结果Bitmap按顺序添加到数组中。然后它通过将这些Bitmaps 添加到Sprite对象来排列它们,相应地创建新行。本质上,我最终得到的是一个按我想要的方式排列的Sprite容器。Bitmaps

现在我通常从这里做的是将它绘制Sprite到一个BitmapDatausing上BitmapData.draw(),它可以工作,然后我继续将它编码为 PNG 并保存它。这一切都有效,除了一种情况。有时我会从多个无组织的 spritesheet 中制作一个排列好的 spritesheet,这会导致一张相当大的表格。在一种情况下,生成的表格非常大,出于某种原因BitmapData,我想绘制的表格不会接受那么大。也就是说,我创建了一个新的BitmapData,其尺寸等于Sprite,但是当我尝试这样做时,我得到了这个错误:

ArgumentError: Error #2015: Invalid BitmapData.

据我所知,只有当我制作BitmapData宽度和/或高度为 0 的 a 或超出最大尺寸时才会发生这种情况。如果不是因为 Flash 11 和 AIR 3 没有限制,我认为是后者。

无论如何,我还没有找到解决方法,所以基本上这是我的问题:有没有办法以不同的方式做到这一点?例如,我可以在Sprite不制作 a的情况下获取 a 的像素数据BitmapData吗?或者,我可以以某种方式将数据存储在 aBitmapData中,而不必为其提供与图像相同的尺寸吗?还是有一些不同的方法可以完全做到这一点?

我意识到我可以将图像分成 2 个单独BitmapData的 s,但我想知道在诉诸此方法之前是否有其他选择。

顺便说一句,如果重要的话,它是一个使用 FlashDevelop 和 Flex 4 SDK 制作的 Adob​​e AIR 应用程序。我正在使用PNGEncoder2对我保存的最终精灵表进行编码。

编辑:我发现问题似乎是我的电脑根本无法处理BitmapData所需大小的 a。我尝试将其拆分为两个单独BitmapData的 s,但不幸的是,在创建第二个时BitmapData我收到了相同的错误。因此,我的 PC 内存中似乎无法同时包含大量数据BitmapData。不幸的是,这意味着我什至不能使用 g10 的解决方案,即BitmapDatas使用他链接到的 PNG 编码器将两个合并为一个 PNG。到目前为止,我的解决方案是将图像的一半存储到 aBitmapData中,对其进行编码,然后dispose()BitmapData另一半存储在其中并对其进行编码。然后我保存ByteArrays(这是编码的结果)作为单独的图像,我可以使用外部程序将其重建为一个。

所以现在,我的问题更多是“我可以以某种方式将其保存为单个 PNG”,而不是“我可以将其作为单个 PNG 保存BitmapData”。

4

2 回答 2

2

我也遇到了这个问题,发现 19,000 x 19,000 像素之间存在限制。那是在带有 Flash Player 11.3 的 Windows 7 上,当然 Flash Player 10 的限制要低得多,请查看此页面了解详细信息

这是我用于测试的代码:

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 中,不知道最大大小是多少。请参阅如何将字节数组转换为图像或图像到字节数组?对于一些示例代码。

于 2012-08-21T12:45:44.023 回答
1

从 inspirit.ru 检查异步 PNGencoder:http
://blog.inspirit.ru/?p=378 提供了 PNGencoder.swc 和使用示例。
图像大小没有限制,只需要一些时间来编码(可能显示进度条)。

编辑:
BitmapData 对象的尺寸(像素数量)有上限,但 PNG 没有,请查看http://code.google.com/p/in-spirit/wiki/PNGEncoder上的使用信息,尤其是 getNextBitmapsRow 回调

专门针对您的情况,而不是在 1 个大的 BitmapData 对象中绘制您的 Sprite,此 PNGEncoder 允许您将您的大 Sprite 拆分为几个小的 BitmapData 对象(例如,从 35,000 x 60,000 像素的 Sprite 中,您可以制作 35 列 x 60 行 = 2100 个 1000x1000 像素的 BitmapData 对象),它通过回调机制实现:创建并传递第一个 BitmapData 对象,lib 对其进行编码,并在完成时调用回调,此时您创建并传递下一个 BitmapData 进行编码。

于 2012-08-21T16:51:11.347 回答