2013-07-16 3 views
0

Я пытаюсь реализовать кнопку «протянуть», чтобы соответствовать изображению на выбранных границах.Не удается перемасштабировать растровое изображение

public void extendS(View v){ 
     ImageView iv = current; 
     double width = gallery.getWidth(); 
     double hight= gallery.getHeight(); 

     double aspect = (width+0)/(hight+0); 
     Log.d("aspect", "w: "+width+" h: "+hight+" a: "+aspect); 
     if (aspect>1){ 
      hight/=aspect; 
     }else{ 
      width*=aspect; 
     } 
     Bitmap b = ((BitmapDrawable) iv.getDrawable()).getBitmap(); 
//  Matrix matrix = new Matrix(); 
     Log.d("aspect", "w: "+width+" h: "+hight+" a: "+aspect); 
     Bitmap scale = Bitmap.createBitmap(b, 0, 0, (int)width, (int)hight); 
     iv.setImageBitmap(scale); 

Ошибка, который я получаю: 07-16: 12: 26: 36,855: Е/AndroidRuntime (12647): Вызванный: java.lang.IllegalArgumentException: у + высота должна быть < = bitmap.height() эта ошибка кажется немного странно с моей точки зрения

ответ

1
public static Bitmap resizeBitmap(Bitmap photo, float x, float y) { 

    try { 
     // get current bitmap width and height 
     int width = photo.getWidth(); 
     int height = photo.getHeight(); 

     // determine how much to scale 
     float scaleWidth = x/width; 
     float scaleHeight = y/height; 

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

     // recreate the new bitmap 
     Bitmap resizebitmap = Bitmap.createBitmap(photo, 0, 0, width, 
       height, matrix, false); 
     return resizebitmap; 

    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } catch (OutOfMemoryError e) { 
     e.printStackTrace(); 
     System.gc(); 
    } 
    return null; 
} 
+0

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

+0

Также соотношение сторон не принимается во внимание – Yarh

+0

, вы также можете попробовать это. iv.setScaleType (ScaleType.FIT_XY); –

1

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

Bitmap.createScaledBitmap(b, (int)width, (int)hight, true); 

Кроме того, вы делаете соотношение сторон неправильно. Подсказка: вам не нужно беспокоиться о соотношении сторон с этим кодом.

+0

нет ошибки? Компилятор говорит, что нет метода Bitmap, createBitmap (bitmap, int, int). Я не вижу такой метод здесь http://developer.android.com/reference/android/graphics/Bitmap.html. Может быть, вы имеете в виду этот метод createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)? что я должен поставить в файл в этом случае? – Yarh

+0

Да, createScaledBitmap() - это то, что вы хотите - отредактированный ответ на правильный. 'filter' должен, вероятно, быть верным для вашего случая, он влияет на метод, используемый для масштабирования. Если фильтр установлен на false, изображения, которые необходимо масштабировать, будут выглядеть блочно. –

Смежные вопросы