Как изменить размер растрового изображения в Android?

У меня есть растровое изображение, взятое из Base64 String из моей удаленной базы данных ( encodedImage – это строка, представляющая изображение с Base64):

 profileImage = (ImageView)findViewById(R.id.profileImage); byte[] imageAsBytes=null; try { imageAsBytes = Base64.decode(encodedImage.getBytes()); } catch (IOException e) {e.printStackTrace();} profileImage.setImageBitmap( BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length) ); 

ProfileImage – мой ImageView

Хорошо, но мне нужно изменить размер этого изображения, прежде чем показывать его в моем ImageView моего макета. Я должен изменить его размер до 120×120.

Может ли кто-нибудь сказать мне код, чтобы изменить его размер?

Приведенные примеры не могут быть применены к полученной растровой картинке base64.

Solutions Collecting From Web of "Как изменить размер растрового изображения в Android?"

Изменить:

 profileImage.setImageBitmap( BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length) 

Для того, чтобы:

 Bitmap b = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length) profileImage.setImageBitmap(Bitmap.createScaledBitmap(b, 120, 120, false)); 
 public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) { int width = bm.getWidth(); int height = bm.getHeight(); 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( bm, 0, 0, width, height, matrix, false); bm.recycle(); return resizedBitmap; } 

EDIT: как предложил by @aveschini, я добавил bm.recycle(); Для утечек памяти. Обратите внимание, что в случае, если вы используете предыдущий объект для некоторых других целей, обработайте соответственно.

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

 Bitmap originalBitmap = <original initialization>; Bitmap resizedBitmap = Bitmap.createScaledBitmap( originalBitmap, newWidth, newHeight, false); 

Масштаб, основанный на соотношении сторон :

 float aspectRatio = yourSelectedImage.getWidth() / (float) yourSelectedImage.getHeight(); int width = 480; int height = Math.round(width / aspectRatio); yourSelectedImage = Bitmap.createScaledBitmap( yourSelectedImage, width, height, false); 

Чтобы использовать высоту в качестве основы для ширины, измените на:

 int height = 480; int width = Math.round(height * aspectRatio); 

Масштабируйте растровое изображение с максимальным размером и шириной цели, сохраняя соотношение сторон:

 int maxHeight = 2000; int maxWidth = 2000; float scale = Math.min(((float)maxHeight / bitmap.getWidth()), ((float)maxWidth / bitmap.getHeight())); Matrix matrix = new Matrix(); matrix.postScale(scale, scale); bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 

Попробуйте этот код:

 BitmapDrawable drawable = (BitmapDrawable) imgview.getDrawable(); Bitmap bmp = drawable.getBitmap(); Bitmap b = Bitmap.createScaledBitmap(bmp, 120, 120, false); 

Надеюсь, это полезно.

Кто-то спросил, как сохранить соотношение сторон в этой ситуации:

Вычислите коэффициент, который вы используете для масштабирования, и используйте его для обоих измерений. Скажем, вы хотите, чтобы изображение было 20% экрана в высоту

 int scaleToUse = 20; // this will be our percentage Bitmap bmp = BitmapFactory.decodeResource( context.getResources(), R.drawable.mypng); int sizeY = screenResolution.y * scaleToUse / 100; int sizeX = bmp.getWidth() * sizeY / bmp.getHeight(); Bitmap scaled = Bitmap.createScaledBitmap(bmp, sizeX, sizeY, false); 

Для получения разрешения экрана у вас есть это решение: получить размеры экрана в пикселях

Попробуйте следующее: эта функция пропорционально изменяет растровое изображение. Когда последний параметр установлен на «X», newDimensionXorY обрабатывается как новая ширина, а при установке «Y» – новая высота.

 public Bitmap getProportionalBitmap(Bitmap bitmap, int newDimensionXorY, String XorY) { if (bitmap == null) { return null; } float xyRatio = 0; int newWidth = 0; int newHeight = 0; if (XorY.toLowerCase().equals("x")) { xyRatio = (float) newDimensionXorY / bitmap.getWidth(); newHeight = (int) (bitmap.getHeight() * xyRatio); bitmap = Bitmap.createScaledBitmap( bitmap, newDimensionXorY, newHeight, true); } else if (XorY.toLowerCase().equals("y")) { xyRatio = (float) newDimensionXorY / bitmap.getHeight(); newWidth = (int) (bitmap.getWidth() * xyRatio); bitmap = Bitmap.createScaledBitmap( bitmap, newWidth, newDimensionXorY, true); } return bitmap; } 
  public Bitmap scaleBitmap(Bitmap mBitmap) { int ScaleSize = 250;//max Height or width to Scale int width = mBitmap.getWidth(); int height = mBitmap.getHeight(); float excessSizeRatio = width > height ? width / ScaleSize : height / ScaleSize; Bitmap bitmap = Bitmap.createBitmap( mBitmap, 0, 0,(int) (width/excessSizeRatio),(int) (height/excessSizeRatio)); //mBitmap.recycle(); if you are not using mBitmap Obj return bitmap; } 
 profileImage.setImageBitmap( Bitmap.createScaledBitmap( BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length), 80, 80, false ) ); 

Начиная с API 19 существуют Bitmap setWidth (int width) и setHeight (int height). http://developer.android.com/reference/android/graphics/Bitmap.html

Растровое изменение размера на основе любого размера дисплея

 public Bitmap bitmapResize(Bitmap imageBitmap) { Bitmap bitmap = imageBitmap; float lengthbmp = bitmap.getHeight(); float widthbmp = bitmap.getWidth(); // Get Screen width DisplayMetrics displaymetrics = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); float hight = displaymetrics.heightPixels / 3; float width = displaymetrics.widthPixels / 3; int convertHighet = (int) hight, convertWidth = (int) width; // high length if (lengthbmp > hight) { convertHighet = (int) hight - 20; bitmap = Bitmap.createScaledBitmap(bitmap, convertWidth, convertHighet, true); } // high width if (widthbmp > width) { convertWidth = (int) width - 20; bitmap = Bitmap.createScaledBitmap(bitmap, convertWidth, convertHighet, true); } return bitmap; } 
 public static Bitmap resizeBitmapByScale( Bitmap bitmap, float scale, boolean recycle) { int width = Math.round(bitmap.getWidth() * scale); int height = Math.round(bitmap.getHeight() * scale); if (width == bitmap.getWidth() && height == bitmap.getHeight()) return bitmap; Bitmap target = Bitmap.createBitmap(width, height, getConfig(bitmap)); Canvas canvas = new Canvas(target); canvas.scale(scale, scale); Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG); canvas.drawBitmap(bitmap, 0, 0, paint); if (recycle) bitmap.recycle(); return target; } private static Bitmap.Config getConfig(Bitmap bitmap) { Bitmap.Config config = bitmap.getConfig(); if (config == null) { config = Bitmap.Config.ARGB_8888; } return config; }