Загрузка только части растрового файла в Android - PullRequest
16 голосов
/ 30 марта 2010

Я хотел бы загрузить обрезанную версию растрового изображения в объект растрового изображения, также не загружая исходное растровое изображение.

Возможно ли это вообще без написания пользовательских процедур загрузки для обработки необработанных данных?

Спасибо, Шандор

Ответы [ 5 ]

12 голосов
/ 30 марта 2010

Это на самом деле очень просто сделать. Используйте

Bitmap yourBitmap = Bitmap.createBitmap(sourceBitmap, x to start from, y to start from, width, height)

Обновление: использовать BitmapRegionDecoder

10 голосов
/ 25 июля 2012

попробуйте

InputStream istream =   null;
try {
     istream = this.getContentResolver().openInputStream(yourBitmapUri);
} catch (FileNotFoundException e1) {
     e1.printStackTrace();
}

BitmapRegionDecoder decoder     =   null;
try {
    decoder = BitmapRegionDecoder.newInstance(istream, false);
} catch (IOException e) {
    e.printStackTrace();
}
Bitmap bMap = decoder.decodeRegion(new Rect(istream, x to start from, y to start from, x to end with, y to end with), null);    
imageView.setImageBitmap(bMap);
0 голосов
/ 09 августа 2016

Вы можете загрузить масштабированную версию растрового изображения без полной загрузки растрового изображения, используя следующий алгоритм

  • Рассчитайте максимально возможный inSampleSize, который все еще дает изображение больше, чем ваша цель.
  • Загрузите изображение, используя BitmapFactory.decodeFile (файл, параметры), передавая inSampleSize как вариант.
  • Измените размеры до желаемых размеров, используя Bitmap.createScaledBitmap ().

Проверьте следующий пост Android: изменение размера большого растрового файла в масштабированный выходной файл для получения дополнительной информации.

0 голосов
/ 05 января 2014

Использование RapidDecoder .

И просто сделай это

import rapid.decoder.BitmapDecoder;

Rect bounds = new Rect(left, top, right, bottom);
Bitmap bitmap = BitmapDecoder.from(getResources(), R.drawable.image)
        .region(bounds).decode();

Требуется Android 2.2 или выше.

0 голосов
/ 08 февраля 2013

@ РКН

Ваш метод также может вызвать исключение OutOfMemoryError - если обрезанное растровое изображение превышает VM.

Мой метод сочетает в себе ваш и защиту от этого исключения: (l, t, r, b -% изображения)

    Bitmap cropBitmap(ContentResolver cr, String file, float l, float t, float r, float b)
{
    try 
    {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;

        // First decode with inJustDecodeBounds=true to check dimensions
        BitmapFactory.decodeFile(file, options);
        int oWidth = options.outWidth;
        int oHeight = options.outHeight;

        InputStream istream = cr.openInputStream(Uri.fromFile(new File(file)));

        BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(istream, false);
        if (decoder != null)
        {
            options = new BitmapFactory.Options();

            int startingSize = 1;
            if ((r - l) * oWidth * (b - t) * oHeight > 2073600)
                startingSize = (int) ((r - l) * oWidth * (b - t) * oHeight / 2073600) + 1;

            for (options.inSampleSize = startingSize; options.inSampleSize <= 32; options.inSampleSize++)
            {
                try
                {
                    return decoder.decodeRegion(new Rect((int) (l * oWidth), (int) (t * oHeight), (int) (r * oWidth), (int) (b * oHeight)), options);    
                }
                catch (OutOfMemoryError e)
                {
                    Continue with for loop if OutOfMemoryError occurs
                }
            }
        }
        else
            return null;
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
    catch (IOException e) 
    {
        e.printStackTrace();
    }

    return null;
}

и возвращает максимально доступное растровое изображение или ноль

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