Как работать с большими растровыми изображениями. Вращение и вставка в галерею - PullRequest
5 голосов
/ 20 февраля 2010

Мне нужно сделать снимок с помощью камеры и, если это зависит от размера изображения, повернуть его перед сохранением в галерее.

Я использую

Intent imageCaptureIntent = new Intent (MediaStore.ACTION_IMAGE_CAPTURE); imageCaptureIntent.putExtra (MediaStore.EXTRA_OUTPUT, uri); startActivityForResult (imageCaptureIntent, IMAGE_CAPTURE);

Чтобы сделать снимок и сохранить его во временном файле.

Тогда

Bitmap bmp = BitmapFactory.decodeFile (imagePath);
String str = android.provider.MediaStore.Images.Media.insertImage (cr, bmp, имя, описание);

Чтобы сохранить его.

Это код, который я пытался использовать для поворота растрового изображения

матричная матрица = новая матрица ();
matrix.postRotate (180);
Битовая карта x = Bitmap.createBitmap (bmp, 0, 0, bmp.getWidth (), bmp.getHeight (), matrix, true);
android.provider.MediaStore.Images.Media.insertImage (cr, x, имя, описание);

Проблема в том, что я получаю исключение OutOfMemoryException.

Есть ли лучший способ обработки растровых изображений, чтобы избежать повреждения памяти?

~ Спасибо заранее, привет

Ответы [ 2 ]

2 голосов
/ 18 ноября 2010

Не думаю, что есть лучший способ обработки растровых изображений. Вы можете попытаться проанализировать данные непосредственно из файла как байт [] порцию за раз и манипулировать ею по частям; это сложно, и вы, вероятно, получите очень некрасивый код.

Я также предлагаю следующее:

  • Используйте android.provider.MediaStore.Images.Media.insertImage(cr, imagePath, name, description) вместо android.provider.MediaStore.Images.Media.insertImage(cr, bmp, name, description), поэтому нет необходимости вызывать Bitmap bmp = BitmapFactory.decodeFile(imagePath), и в этот момент растровое изображение не будет загружено в память.

  • Во всем коде убедитесь, что ни одно растровое изображение не загружено без необходимости. Установите растровые изображения, которые больше не нужны, на null и вызовите сборщик мусора, или используйте bmp.recycle().

0 голосов
/ 16 февраля 2015

У меня была такая же проблема с вращающимся растровым изображением.Проблема здесь:

    Bitmap bmp = BitmapFactory.decodeFile(imagePath); //this is the image you want to rotate
    // keeping in mind that you want to rotate the whole original image instead
    // of its downscaled copy you cant use BitmapFactory downscaling ratio
    Matrix matrix = new Matrix();
    matrix.postRotate(180);
    Bitmap x = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); 
    // the line above creates another bitmap so we have here 2 same sized bitmaps
    // even using the same var (bmp instead of x) wont change anything here
    // so you gonna get the OOM here

в том, что он создает 2 растровых изображения, поэтому им требуется больше оперативной памяти в 2 раза.
Проверьте мой вопрос и решение здесь .Бьюсь об заклад на ImageMagick lib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...