Естественно, вы ограничены памятью, когда хотите создавать огромные растровые изображения, но у вас достаточно памяти для создания довольно больших растровых изображений.Например, для растрового изображения 1024 * 1024 ARGB_8888 потребуется примерно 4 МБ памяти, что не является проблемой, если ваше приложение в целом экономит память.Нормальный размер кучи для приложения Android обычно составляет 16-32 МБ в зависимости от версии Android, просто чтобы дать вам представление о том, с чем вам нужно играть.
Вы говорите, что делаете копию большого растрового изображения,и это может быть вашей главной проблемой.Нет необходимости делать копию большого растрового изображения, вам нужен только один.Вот пример проекта, который создает большое (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
, которое выглядит примерно так: