java Android - программная работа с масштабированием/обрезкой изображения

Что ж, все это мучает меня долгими неделями, я устанавливаю изображение высотой 227 пикселей в масштабе до 170 пикселей, даже если я хочу, чтобы оно было wrap_content всякий раз, когда я это делаю.

В порядке. Здесь я беру свое изображение длиной 1950 пикселей (здесь я помещаю его часть, чтобы вы могли понять, как оно должно выглядеть).

введите здесь описание изображения

Во-первых, я хочу уменьшить его до 227 пикселей в высоту, потому что именно так он был разработан и таким он должен быть.

Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.ver_bottom_panel_tiled_long);
            int width = bitmapOrg.getWidth();
        int height = bitmapOrg.getHeight();
        int newWidth = 200; //this should be parent's whdth later
        int newHeight = 227;

        // calculate the scale
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;

        // create a matrix for the manipulation
        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);

        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, 
                          width, height, matrix, true); 


        BitmapDrawable dmpDrwbl=new BitmapDrawable(resizedBitmap);

    verbottompanelprayer.setBackgroundDrawable(dmpDrwbl);

так что ... это вовсе не обрезанное изображение - нет, это 1950 пикселей, сжатых до 200 пикселей. введите здесь описание изображения

Но я хочу просто обрезать что-нибудь, кроме этих 200 пикселей или любой другой ширины, которую я установлю, - обрезать, а не вжимать все это длинное изображение в область 200 пикселей.

Кроме того, BitmapDrawable (растровое изображение); и imageView.setBackgroundDrawable(drawable); устарели - как я могу это изменить?


person user2234594    schedule 19.08.2013    source источник


Ответы (1)


судя по тому, что я вижу, вы создаете растровое изображение нового размера (200x227), поэтому я не уверен, чего вы ожидали. вы даже в комментах написали, что масштабируете и ни слова о кадрировании...

что вы можете сделать, это:

  1. если API не ниже 10 (пряничный) , вы можете использовать BitmapRegionDecoder , используя Регион декодирования :

  2. если API слишком старый, вам нужно декодировать большое растровое изображение, а затем обрезать его в новое растровое изображение, используя Bitmap.createBitmap

что-то вроде этого:

final Rect rect =...
if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD_MR1)
  {
  BitmapRegionDecoder decoder=BitmapRegionDecoder.newInstance(imageFilePath, true);
  croppedBitmap= decoder.decodeRegion(rect, null);
  decoder.recycle();
  }
else 
  {
  Bitmap bitmapOriginal=BitmapFactory.decodeFile(imageFilePath, null);
  croppedBitmap=Bitmap.createBitmap(bitmapOriginal,rect.left,rect.top,rect.width(),rect.height());
  }
person android developer    schedule 19.08.2013
comment
Не могли бы вы привести пример, как обрезать его с помощью Bitmap.CreateBitmap? Он просто все еще не обрезается, просто попытайтесь вместить в него все изображение. может я что то не так делаю? - person user2234594; 19.08.2013
comment
Вы проверили ссылку, которую я только что дал вам? вам нужно использовать правильную функцию. в любом случае, я написал пример кода, хотя я не уверен, что он хорошо компилируется. - person android developer; 19.08.2013
comment
вот в чем проблема - я хочу использовать BitmapRegionDecoder, но он работает только с файлами. Но я хочу использовать его с ресурсами - разными dpi. Работа с файлами усложнит это. есть ли способ использовать BitmapRegionDecoder с ресурсами? - person user2234594; 19.08.2013
comment
Пожалуйста, прочитайте то, что я вам дал. Я не могу научить вас всему, что касается Android, в одном месте... это касается не только файлов. я показал только пример. вы также можете использовать inputStream или fileDescriptor. вы можете, например, использовать getResources().openRawResource(R.drawable....) - person android developer; 19.08.2013
comment
это безумие для меня........................ я получаю изображение из ресурсов.. оригинал 227 пикселей.. если я использую getHeight - он возвращает 170 пикс. если я помещу его в bitmap.xml - это будет 170 пикселей. Но если я его обрежу - высота снова будет 227 пикселей!!! Что происходит??? - person user2234594; 19.08.2013
comment
может ли это быть похожей на это проблемой: кеш растрового изображения занимает много памяти"> stackoverflow.com/questions/18255572/? - person android developer; 19.08.2013
comment
Большое спасибо за ссылку! Эти даунскейлинги сильно попортили мне кровь за последние недели - person user2234594; 19.08.2013
comment
так это была проблема? вы поместили растровый файл в нежелательное место? Кстати, другой ответ был также сделан мной... - person android developer; 19.08.2013
comment
Ну, проблема в том, что у вас есть файл png. это 227 пикселей в высоту. вы помещаете его в bitmap.xml или растровое изображение, декодированное из ресурсов, вы размещаете его на макете .. и оно имеет высоту 170 пикселей. до 227 пикселей в высоту.. Я думаю, что это ошибка - person user2234594; 20.08.2013
comment
еще раз, вы уверены, что прочитали то, что я написал? в какую папку вы поместили файл изображения и почему вы создали файл xml? что в xml файле? я думаю, вам следует отредактировать свой вопрос, чтобы точно показать, что вы пытаетесь сделать и что вы сделали до сих пор. - person android developer; 20.08.2013
comment
что такое файл bitmap.xml? ну.... с чего начать? изображение находится в res/drawable/xhdpi, я тестирую его на экране xhdpi. Если он подходит к экрану - он уменьшен на ~ 30%, если он обрезан - это реальный размер. Я не знаю, насколько яснее я могу объяснить это вам - person user2234594; 20.08.2013