2016-02-22 2 views
0

Похоже, что BitmapFactory.decodeResource() игнорирует inScaled, когда inJustDecodeBounds также является «истинным».BitmapFactory.decodeResource() игнорирование inScaled

В этом надреза кода:

Resources res = getResources(); 
DisplayMetrics metrics = res.getDisplayMetrics(); 

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inScaled = true; 
options.inDensity = DisplayMetrics.DENSITY_HIGH; // resolution of bitmap in resources 
options.inTargetDensity = metrics.densityDpi; // screen resolution 

options.inJustDecodeBounds = true; 
Bitmap bitmap = BitmapFactory.decodeResource (res, srcId, options); 
logD ("IVH decodeBitmapResource.1: " + options.outWidth + "," + options.outHeight + " - " + srcId); 

options.inJustDecodeBounds = false; 
bitmap = BitmapFactory.decodeResource (getResources(), srcId, options); 
logD ("IVH decodeBitmapResource.2: " + options.outWidth + "," + options.outHeight + " - " + srcId); 

я получаю следующий результат в моем файле журнала:

IVH decodeBitmapResource.1: 420,747 - 2130837613 
IVH decodeBitmapResource.2: 840,1494 - 2130837613 

Все, что я делал, было изменение inJustDecodeBounds от истинного на ложное. Что мне не хватает?

ответ

1

Возможно, ответ должен быть очевиден: inJustDecodeBounds должен игнорировать все другие директивы, даже масштабирование.

Следующий код, при установке inJustDecodeBounds "истина" решает проблему:

float scale = (float)metrics.densityDpi/(float)DisplayMetrics.DENSITY_HIGH; 

imageWidth = (int) (options.outWidth * scale + 0.5); 
imageHeight = (int) (options.outHeight * scale + 0.5); 

Тем не менее, приходят на Google. У вас есть весь код в этом API; почему вы заставляете меня переписывать его. Просто укажите другой флаг, который делает все, кроме рендеринга растрового изображения. Затем, с одним флагом, я мог бы вычислить границы и, перевернув флаг, визуализировать растровое изображение, чтобы он точно соответствовал.

+0

Вы говорите «предположительно», но я не вижу его в джавадоке. Так что это либо ошибка в документах, либо ошибка на платформе, но мы не знаем, какой из них. –

+0

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

+0

Вы правы. Вот почему они позволяют вам регистрировать ошибки: https://code.google.com/p/android/issues/entry?template=Developer%20Documentation –

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