Как обрезать растровое изображение с минимальным использованием памяти? - PullRequest
1 голос
/ 08 марта 2012

В моем приложении я загружаю множество изображений из Интернета.Пока все работает нормально:

@Override
public void onSuccess( byte[] response )
{
    Bitmap image = BitmapFactory.decodeByteArray( response, 0, response.length, options );

    ...
}

Но на самом деле было бы неплохо использовать только часть изображения во время процесса подачи заявки.Поэтому я попробовал что-то вроде этого:

@Override
public void onSuccess( byte[] response )
{
    Bitmap source = BitmapFactory.decodeByteArray( response, 0, response.length, options );
    Bitmap image = Bitmap.createBitmap( source, 0, 0, source.getWidth(), source.getHeight() - 30 );
    source.recycle();
    source = null;

    ...
}

Но мое приложение продолжает падать после загрузки нескольких десятков изображений (OutOfMemoryException).Поэтому (я полагаю) у меня есть две возможности избавиться от высоты в 30 пикселей (на самом деле это информация о кредите, но не волнуйтесь, я не краду, все нормально, если я ее скрываю):

  • Обрезать и сохранить изображение с меньшим использованием памяти, или
  • Манипулировать ImageView, чтобы скрыть нижнюю часть изображения (высота может изменяться в зависимости от масштаба)

Но янужен совет по этим методам.

Ответы [ 3 ]

1 голос
/ 09 марта 2012

Попробуйте что-то вроде этого:

    private Bitmap trimImage(Bitmap source)
    {
        int trimY = 20; //Whatever you want to cut off the top
        Bitmap bmOverlay = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig());
        Canvas c = new Canvas(bmOverlay);

        //Source and destination Rects based on sprite animation.
        Rect srcRect = new Rect(0, trimY, source.getWidth(), source.getHeight()); 
        Rect dstRect = new Rect(0, 0, source.getWidth(), source.getHeight());
        c.drawBitmap(manual1, srcRect, dstRect, null);

        return bmOverlay;
    }

Это не было проверено, но что-то вроде этого может помочь.

0 голосов
/ 08 марта 2012

Обычный подход к экономии памяти с помощью растровых изображений заключается в декодировании изображения в пространство, которое предварительно масштабируется в соответствии с вашими целями.Вот (вероятно, слишком) простой пример .(Лучший подход ограничил бы коэффициент масштабирования степенями 2).

0 голосов
/ 08 марта 2012

Хай, пожалуйста, используйте этот код

ImageView image = (ImageView) findViewById(R.id.sd);
    Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.ss);

    Bitmap bMapScaled = Bitmap.createScaledBitmap(bMap, 180, 220, true);
    image.setImageBitmap(bMapScaled);

, в этом примере изображение "ss" будет масштабироваться или изменяться, что помогло вам

...