1

未配置のスプライトシートを開いて、XMLファイルに従って配置し、PNGとして保存できるプログラムを自分で作成しています。未配置のシートをロードしてに配置BitmapDataし、特定のXMLファイルに従ってシートの各フレームを(を使用して)取得し、結果を順番に配列にBitmapData.copypixels()追加します。Bitmap次に、これらBitmapSpriteオブジェクトに追加して配置し、それに応じて新しい行を作成します。本質的に、私が最終的に得たのは、私が望むように配置されたSprite封じ込めです。Bitmaps

ここで私が通常行うことはSpriteBitmapDatausingBitmapData.draw()に描画することです。これは機能し、次にそれをPNGとしてエンコードして保存します。これは、1つの場合を除いて、すべて機能します。時々、私は複数の整理されていないものから1つの配置されたスプライトシートを作成します。その結果、かなり大きなシートになります。ある場合、この結果のシートは非常に大きく、なぜかBitmapData私が描きたいものはそれほど大きくないことを受け入れません。つまり、BitmapData寸法がに等しい新しいを作成しますSpriteが、これを実行しようとすると、次のエラーが発生します。

ArgumentError: Error #2015: Invalid BitmapData.

私の知る限り、これBitmapDataは幅や高さが0の場合、または最大寸法を超えた場合にのみ発生します。Flash11とAIR3に制限がないという事実がなければ、後者だったと思います。

いずれにせよ、私はそれから抜け出す方法を見つけられなかったので、基本的にこれは私の質問です:これを別の方法で行う方法はありますか?たとえば、?Spriteを作成せずにのピクセルデータを取得できBitmapDataますか?または、BitmapData画像と同じサイズを指定せずに、どういうわけかデータをに保存できますか?または、これを完全に行うための別の方法はありますか?

画像を2つに分割できることはBitmapDataわかっていますが、これに頼る前に別の方法があるかどうかを知りたいと思います。

ちなみに、重要なのは、FlashDevelopとFlex4SDKを使用して作成されたAdobeAIRアプリです。PNGEncoder2を使用して、保存する最終的なスプライトシートをエンコードしています。

BitmapData編集:問題は、私のPCが必要なサイズのを単に処理できないことであるように思われることを発見しました。それを2つの別々のに分割しようとしましBitmapDataたが、残念ながら、2番目を作成するときBitmapDataに同じエラーが発生しました。したがって、その量のデータをBitmapData一度にsとしてPCのメモリに含めることはできないように思われます。BitmapDatas残念ながら、これは、彼がリンクしたPNGエンコーダーを使用して2つを1つのPNGにマージするg10のソリューションを使用することさえできないことを意味します。これまでの私の解決策は、画像の半分をに保存してBitmapDataエンコードし、次に残りdispose()BitmapData半分を保存してエンコードすることでした。それから私は保存しますByteArrays(エンコードの結果です)個別の画像として、外部プログラムを使用して1つに再構築できます。

だから今、私の質問は、「単一として取得できるか」ではなく、「これを単一の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 にコピーすることもできますが、その最大サイズはわかりません。bytearray を画像に、または画像を bytearray に変換する方法を参照してください。いくつかのサンプルコードについて。

于 2012-08-21T12:45:44.023 に答える
1

inspirit.ru から async PNGencoder を確認してください: http://blog.inspirit.ru/?p=378
PNGencoder.swc と使用例が提供されています。
画像のサイズに制限はなく、エンコードに時間がかかるだけです (プログレス バーを表示できます)。

編集:
BitmapData オブジェクトのサイズ (ピクセル数) には上限がありますが、PNG には上限がありません。http://code.google.com/p/in-spirit/wiki/PNGEncoderで使用情報を確認してください。 、特に getNextBitmapsRow コールバック

具体的には、スプライトを 1 つの大きな BitmapData オブジェクトで描画する代わりに、この PNGEncoder を使用すると、大きなスプライトをいくつかの小さな BitmapData オブジェクトに分割できます (たとえば、35,000 x 60,000 ピクセルのスプライトから、35 列 x 60 行を作成できます = 1000x1000 ピクセルの 2100 個の BitmapData オブジェクト)、これはコールバック メカニズムで行われます。最初の BitmapData オブジェクトを作成して渡すと、lib がそれをエンコードし、終了時にコールバックを呼び出します。その時点で次の BitmapData を作成して渡します。

于 2012-08-21T16:51:11.347 に答える