Если вы читаете учебник here вы увидите, Google дает очень подробное руководство по масштабированию растровых изображений без чрезмерного использования памяти.
В частности, эти два метода (из учебника):
public static Bitmap decodeSampledBitmapFromResource(File file, int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(file, options);
}
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight){
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height/2;
final int halfWidth = width/2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight/inSampleSize) > reqHeight
&& (halfWidth/inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
выполнит свое масштабирование, сохраняя пропорцию.
Трюк с этими двумя методами является то, что первая операция декодирования устанавливается только декодировать свойства об изображении (размеры и другую информацию), как установлено:
options.inJustDecodeBounds = true;
, в котором новый масштабный коэффициент вычисляется пропорционально методом вычислениеInSampleSize().
Затем изображение декодируется снова, на этот раз с
options.inJustDecodeBounds = false;
, а также масштабного коэффициента набора, так что растровое завод автоматически масштабирует во время декодирования, уменьшая объем памяти.
Какое разрешение изображения необходимо декодировать, это действительно зависит от вашего прецедента. Но, если конкретное изображение не должно быть увеличено позже, вам нужно не больше, чем физический размер экрана устройства, которое может быть получено с помощью:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getRealSize(size);
в каком объекте size
будет держать размер экрана устройства.
«Сделать это меньше» * означает * снижение качества. – chrylis
это хорошо, но пусть потеря будет невелика.важно поддерживать соотношение сторон – ip696
, или вам может и не понадобиться это делать, и я просто не могу понять, насколько моя библиотека работает медленнее при обработке больших изображений. – ip696