私はCanvasを使用して小さな白いサーフェスに小さなグラフィックを描くことができます。問題は、大きな空のビットマップから始めると、ARGB_8888を使用して可変コピーを作成するとすぐにAndroidがメモリ不足になることです。私は何かが欠落している場合や、小さなグラフィックを大きな白い面に合成し、Androidのメモリの制約のためにPNGまたはJPGとして保存することは実際には不可能なのか不思議です。Canvasで巨大な白いビットマップを作成するにはどうすればよいですか?
4
A
答えて
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
のようなビットマップ得るでしょう: "大" でどのように大きな
+0
nice write up :) –
関連する問題
- 1. AndroidでCanvasを作成するにはどうすればよいですか?
- 2. 巨大なビットマップ
- 3. 巨大なWordPressマルチサイトデータベースを別々のMySQLデータベースに分割するにはどうすればよいですか?
- 4. 巨大なscript.sqlデータベースをSQL Server 2008に復元するにはどうすればよいですか?
- 5. 巨大なラスタスタックを使用して計算をスピードアップするにはどうすればよいですか?
- 6. 巨大なサイズのファイルをローカルからhdfsにロードするにはどうすればいいですか
- 7. tkinter Canvasにボタンを作成するにはどうすればよいですか?
- 8. Android - ImageSpanに大きなビットマップを設定するにはどうすればよいですか?
- 9. IDLEが巨大なリストを印刷するのを止めるにはどうすればいいですか?
- 10. 巨大なビットマップを処理する
- 11. 巨大なAIFFファイルを救済するにはどうすればいいですか?
- 12. BITMAPV5HEADERヘッダーを使用してビットマップを作成するにはどうすればよいですか?
- 13. CronJobでログファイルを作成できないようにするにはどうすればよいですか?
- 14. Google検索アプライアンスで大きなファイルのインデックスを作成するにはどうすればよいですか?
- 15. ウィンドウ内にビットマップをロードするにはどうすればよいですか?
- 16. TChartをビットマップにエクスポートするにはどうすればよいですか?
- 17. ビットマップにボールドテキストを描画するにはどうすればよいですか?
- 18. Grails 3でセッションが作成されないようにするにはどうすればよいですか?
- 19. html5 canvas - テキストを伸ばすにはどうすればいいですか?
- 20. プログラムで生成されたビットマップをビューに配置するにはどうすればよいですか?
- 21. ウェブサービスアプリの作成にはどうすればよいですか?
- 22. sqlalchemyがselectでトランザクションを作成しないようにするにはどうすればよいですか?
- 23. ReSharperがソリューションでフォルダを作成しないようにするにはどうすればよいですか?
- 24. ループ内で関数を作成しないようにするにはどうすればよいですか?
- 25. インデックス作成中に大きなファイルを除外するにはどうすればよいですか?
- 26. テキストフィールドの作成を空白だけで制限するにはどうすればよいですか?
- 27. アンギュラマテリアルデザインで白黒テーマを作成するにはどうすればよいですか?
- 28. ボックスで空白の作成を停止するにはどうすればよいですか?
- 29. メモリが限られた巨大なイメージデータセットにzcaを適用するにはどうすればいいですか?どのようなGoogleの
- 30. 大きなコンテンツ用の動画プレーヤーを作成するにはどうすればよいですか?
を? –
あなたが提供した情報で最も簡単に最適化するには、ARGB_8888を使用せず、画像が1つの不透明なペイントなので、RGB_888を使用するだけです。これにより、画像の1ピクセルあたりのバイト数が節約されます。イメージを描画するために使用しているコードを提供する可能性があります。 –
それは1つの不透明な塗料ですが、それは本当に私の質問ではありません。以前のキャンバスを再利用するのではなく、キャンバスの内容を新しいビットマップにダンプするだけです。キャンバスをバイト配列に書き込む方法はありますか?あるいは、私はいつも描画する既存のビットマップから始めなければならないのですか? –