2012-02-14 7 views
4

私はCanvasを使用して小さな白いサーフェスに小さなグラフィックを描くことができます。問題は、大きな空のビットマップから始めると、ARGB_8888を使用して可変コピーを作成するとすぐにAndroidがメモリ不足になることです。私は何かが欠落している場合や、小さなグラフィックを大きな白い面に合成し、Androidのメモリの制約のためにPNGまたはJPGとして保存することは実際には不可能なのか不思議です。Canvasで巨大な白いビットマップを作成するにはどうすればよいですか?

+0

を? –

+0

あなたが提供した情報で最も簡単に最適化するには、ARGB_8888を使用せず、画像が1つの不透明なペイントなので、RGB_888を使用するだけです。これにより、画像の1ピクセルあたりのバイト数が節約されます。イメージを描画するために使用しているコードを提供する可能性があります。 –

+0

それは1つの不透明な塗料ですが、それは本当に私の質問ではありません。以前のキャンバスを再利用するのではなく、キャンバスの内容を新しいビットマップにダンプするだけです。キャンバスをバイト配列に書き込む方法はありますか?あるいは、私はいつも描画する既存のビットマップから始めなければならないのですか? –

答えて

6

もちろん、巨大なビットマップを作成する場合はメモリに限りがありますが、非常に大きなビットマップを作成するのに十分なメモリがあります。たとえば、1024 * 1024のARGB_8888ビットマップには約4 MBのメモリが必要ですが、一般的にメモリが控えめであれば問題ありません。 Androidアプリの通常のヒープサイズは、Androidのバージョンによって、通常は16〜32MBの範囲で、プレイする必要があることに対する感覚を与えます。

大きなビットマップのコピーを作成すると、それが主な問題になる可能性があります。大きなビットマップのコピーを作成する必要はありません。必要なのは1つだけです。ここでは、大(* 1024 1024)白ビットマップを作成し、それの真ん中に自分のアプリで表示を描画するサンプルプロジェクトです、その後、PNGに結果を書き込みます。この主なレイアウトと一緒に

package com.example.android; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.View; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 

public class WhitePngActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     findViewById(R.id.draw_to_bitmap).setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       Bitmap largeWhiteBitmap = Bitmap.createBitmap(1024, 1024, Bitmap.Config.ARGB_8888); 

       // Make a canvas with which we can draw to the bitmap 
       Canvas canvas = new Canvas(largeWhiteBitmap); 

       // Fill with white 
       canvas.drawColor(0xffffffff); 

       // Draw the view to the middle of the big white bitmap. In this 
       // case, it will be the button, but you can draw any View in 
       // your view hierarchy to the bitmap like this. And of course 
       // you can position the View anywhere you want 
       canvas.save(); 
       canvas.translate(
         largeWhiteBitmap.getWidth()/2 - view.getWidth()/2, 
         largeWhiteBitmap.getHeight()/2 - view.getHeight()/2); 
       view.draw(canvas); 
       canvas.restore(); 

       // Write the file (don't forget android.permission.WRITE_EXTERNAL_STORAGE) 
       File pictureDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
       File pngFile = new File(pictureDir, "big-white-image-with-view.png"); 
       try { 
        largeWhiteBitmap.compress(Bitmap.CompressFormat.PNG, 0, new FileOutputStream(pngFile)); 
       } catch (FileNotFoundException e) { 
        Log.e("WhitePngActivity", "Could not write " + pngFile, e); 
       } 

       // Immediately release the bitmap memory to avoid OutOfMemory exception 
       largeWhiteBitmap.recycle(); 
      } 
     }); 
    } 
} 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/draw_to_bitmap" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Click to draw to bitmap" /> 

</LinearLayout> 

あなたはこのような何かに見えるどこか/mnt/sdcard/Pictures/big-white-image-with-view.pngのようなビットマップ得るでしょう: "大" でどのように大きな

enter image description here

+0

nice write up :) –

関連する問題