Мне кажется, что другим возможным решением является изменение первой строки:
Bitmap bitmapOrg = BitmapFactory.decodeFile("/sdcard/"+ photoName + ".jpg");
С кодом:
Bitmap bitmapOrg = BitmapFactory.decodeFile("/sdcard/"+ photoName + ".jpg", (new BitmapFactory.Options()).inDensity=0);
Но я не проверял это решение.
Более того, мне кажется, что ваше решение также должно работать. Я думаю, что где-то есть ошибка в AOSP, потому что:
- Функция
createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
не изменяет плотность файла (bitmap.mDensity = source.mDensity;
). Новая плотность равна плотности источника. Таким образом, кажется, что плотность изменяется до этого вызова.
BitmapFactory.decodeFile calls BitmapFactory.decodeFile
с параметрами (pathName, null)
BitmapFactory.decodeFile(pathName, null)
преобразует файл в поток и вызывает BitmapFactory.decodeStream(stream, null, opts)
, где opts = null
BitmapFactory.decodeStream(stream, null, opts)
вызывает нативную функцию bm = nativeDecodeStream(is, tempStorage, outPadding, opts);
, а затем вызывает finishDecode(bm, outPadding, opts);
Помните, что в нашем случае опции равны нулю.
В finishDecode(bm, outPadding, opts)
есть первая проверка, которая должна вернуть битовую карту без изменений (в нашем случае опции должны быть нулевыми):
if (bm == null || opts == null) {
возврат бм;
}
Таким образом, кажется, что с опциями в нативной функции произошло нечто плохое: nativeDecodeStream(is, tempStorage, outPadding, opts)
Требуется много времени, чтобы проверить, где проблема. Кроме того, я не уверен, что я прав в своих выводах.