Как мне создать огромный белый рисунок с помощью Canvas? - PullRequest
4 голосов
/ 14 февраля 2012

Я пытаюсь понять, как я могу использовать Canvas, чтобы нарисовать маленький рисунок (не имеет значения, что это) на большой белой поверхности.Проблема заключается в том, что если я начну с большого пустого растрового изображения, то при создании изменяемой его копии с помощью ARGB_8888 Android сразу же не хватит памяти.Мне любопытно, если я что-то упустил, или если на самом деле невозможно наложить небольшую графику на большую белую поверхность и сохранить ее в формате PNG или JPG из-за ограничений памяти в Android.

1 Ответ

6 голосов
/ 15 февраля 2012

Естественно, вы ограничены памятью, когда хотите создавать огромные растровые изображения, но у вас достаточно памяти для создания довольно больших растровых изображений.Например, для растрового изображения 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, которое выглядит примерно так:

enter image description here

...