0

コンポーネントを JPG ファイルとして保存しようとしていますが、BitmapData.draw() を取得して期待どおりのピクセルを取得できないようで、結果の JPG ファイルを開くと、代わりに真っ白な長方形が表示されます。 . 最初に画像とキャプション (以下の MultigraphCanvas) を含むオブジェクトを作成しています。オブジェクトをポップアップとして表示すると完璧に見えますが、ビットマップとして描画してからエンコードして保存しようとすると、 JPG 画面に表示できるのと同じ画像にはなりません。コードは次のとおりです。

        private function saveAsFile(title:String):void
        {
            // make a canvas containing the multigraph and title
            var multigraphCanvas:MultigraphCanvas = new MultigraphCanvas();
            multigraphCanvas.initialize();
            multigraphCanvas.multigraphGroup = multigraphGroup;
            multigraphCanvas.titleText.text = title;

            this.addElement(multigraphCanvas);

            var matrix:Matrix = new Matrix()
            matrix.tx = 0;
            matrix.ty = 0;
            var multigraphCanvasBitmapData:BitmapData = new BitmapData(multigraphCanvas.width, multigraphCanvas.height, true, 0xffffffff);
            multigraphCanvasBitmapData.draw(multigraphCanvas, matrix);
            var multigraphCanvasImage:Image = new Image();
            multigraphCanvasImage.load(new Bitmap(multigraphCanvasBitmapData));
            multigraphCanvasImage.content.width = multigraphCanvas.width;
            multigraphCanvasImage.content.height = multigraphCanvas.height;
            var multigraphCanvasImageBitmapData:BitmapData = new BitmapData(multigraphCanvas.width, multigraphCanvas.height, true, 0xffffffff);
            multigraphCanvasImageBitmapData.draw(multigraphCanvasImage); 

            // DEBUGGING
            PopUpManager.addPopUp(multigraphCanvas, this);

            // DEBUGGING
            var debugImage:Image = new Image();
            debugImage.source = multigraphCanvasImageBitmapData;
            var debugTitleWindow:TitleWindow = new TitleWindow();
            debugTitleWindow.addElement(debugImage);
            PopUpManager.addPopUp(debugTitleWindow, this);

            // encode the canvas bitmap into a JPG byte array
            var jpgEncoder:JPEGEncoder = new JPEGEncoder(85);
            var jpgByteArray:ByteArray = jpgEncoder.encode(multigraphCanvasImageBitmapData);

            // save the JPG byte array as a file
            var fileReference:FileReference = new FileReference();
            fileReference.save(jpgByteArray, title + ".jpg");
        }

BitmapData.draw() メソッドが渡された表示オブジェクトの各コンポーネントを描画することを期待できますか、それとも最上位の要素のみをレンダリングし、子要素はレンダリングしませんか (これは私にはどのように見えますか)?

4

3 に答える 3

0

ソース表示オブジェクトコンテナの登録ポイントを確認してください。

次のシナリオを想像してみましょう。

表示オブジェクトコンテナには長方形のようなビジュアルが含まれており、このDisplayObjectContainerの左下に登録があるため、x、y=1,1で使用できるコンテンツはありません。

BitmapData.drawは、0,0から始まるコンテンツをコピーするため(マトリックス変換で特に指定しない場合)、空の白い領域(またはBitmapDataのデフォルトの塗りつぶし色)が取得されます。

于 2011-10-27T09:04:50.243 に答える
0

BitmapData.draw()コンポーネントをレンダリングできるようにするには、コンポーネントを表示ツリーに配置する必要があると思います。

于 2011-04-01T16:05:00.443 に答える
0

私は過去 24 時間稼働しているので、機能が壊れていても私を責めないでください :) これは、コンテナー (c1) のスナップショットを取得してサーバーに送信する、私が持っている機能の簡易バージョンです。 . 私は base64 エンコーディングでした。これは、Java 担当者がバックエンドに求めていたものでした。必要に応じて設定をマッサージする必要があります。この機能で持っていたものの多くを切り取った

private function getSnapShot( e:MouseEvent ):String{
  var matrix:Matrix = new Matrix()
  matrix.tx = 0;
  matrix.ty = 0;
  var finished1:BitmapData = new BitmapData(this.c1.width,this.c1.height,true,0xffffffff);
  finished1.draw( this.c1, matrix  );
  var myImage:Image = new Image();
  myImage.load( new Bitmap(finished1) );
  myImage.content.width = this.c1.width;
  myImage.content.height = this.c1.height;
  var finished:BitmapData = new BitmapData(this.c1.width,this.c1.height,true,0xffffffff);
  finished.draw(myImage); 
  myImage = null;
  var encoder:JPEGEncoder = new JPEGEncoder();
  var data:ByteArray = encoder.encode(finished);
  var b64:Base64Encoder = new Base64Encoder()
  b64.encodeBytes( data )
  return b64.toString();
}

おそらくJPGである「データ」のみを返す必要があります

于 2011-04-01T16:21:42.173 に答える