【发布时间】:2012-08-16 18:36:09
【问题描述】:
我正在为自己制作一个程序,它可以打开未排列的精灵表,根据 XML 文件排列它们,然后将它们保存为 PNG。它的作用是加载未排列的工作表并将其放入BitmapData,然后根据特定的 XML 文件抓取工作表上的每一帧(使用BitmapData.copypixels()),并将生成的Bitmap 添加到命令。然后通过将这些Bitmaps 添加到Sprite 对象来排列它们,相应地创建新行。本质上,我最终得到的是一个包含Bitmaps 的Sprite,它们按照我想要的方式排列。
现在我通常从这里做的是使用BitmapData.draw() 将Sprite 绘制到BitmapData 上,这可行,然后我继续将其编码为PNG 并保存它。这一切都有效,除了一种情况。
有时我会从多个无组织的 spritesheet 中制作一个排列好的 spritesheet,这会导致一张相当大的表格。在一种情况下,生成的表格非常大,出于某种原因,我想绘制的BitmapData 不会接受那么大。也就是说,我创建了一个新的BitmapData,其尺寸等于Sprite,但是当我尝试这样做时,我得到了这个错误:
ArgumentError: Error #2015: Invalid BitmapData.
据我所知,只有当我创建一个宽度和/或高度为 0 的 BitmapData,或者我超过了最大尺寸时,才会发生这种情况。如果不是因为 Flash 11 和 AIR 3 没有限制,我认为是后者。
无论如何我都没有找到解决办法,所以基本上这是我的问题:有什么不同的方法吗?例如,我可以在不制作BitmapData 的情况下获取Sprite 的像素数据吗?或者,我可以以某种方式将数据存储在BitmapData 中,而不必为其提供与图像相同的尺寸吗?或者有什么不同的方法可以做到这一点?
我意识到我可以将图像拆分为 2 个单独的 BitmapDatas,但我想知道在求助之前是否有其他选择。
顺便说一句,如果重要的话,它是使用 FlashDevelop 和 Flex 4 SDK 制作的 Adobe AIR 应用程序。我正在使用PNGEncoder2 对我保存的最终精灵表进行编码。
编辑:我发现问题似乎是我的电脑根本无法处理所需大小的BitmapData。我尝试将其拆分为两个单独的 BitmapDatas,但不幸的是,在创建第二个 BitmapData 时,我收到了同样的错误。因此,我的 PC 内存中似乎无法同时包含 BitmapDatas 的数据量。不幸的是,这意味着我什至不能使用 g10 的解决方案,即使用他链接到的 PNG 编码器将两个 BitmapDatas 合并到一个 PNG 中。
到目前为止,我的解决方案是将图像的一半存储到BitmapData 中,对其进行编码,然后将dispose() BitmapData 存储在其中并对其进行编码。然后我将ByteArrays(编码的结果)保存为单独的图像,我可以使用外部程序将其重建为一个。
所以现在,我的问题更多是“我可以以某种方式将其保存为单个 PNG”而不是“我可以将其保存为单个 BitmapData”。
【问题讨论】:
-
这是否意味着您不需要显示很大,您只是为上传/保存过程组装图像?
-
@r.bitter 没错,完全不需要显示。
标签: actionscript-3 air png sprite bitmapdata