В приложении для Android я загружаю и загружаю изображения в формате JPEG. Для некоторых изображений BitmapFactory
загруженный образ, и я не понимаю, почему и как его остановить. Я регистрирую размер объекта Bitmap при загрузке и загрузке изображений:
Uploading image with size 3840x2160 Opening received image of size 2601584B degradation 0 decoded 384x216
Таким образом, моя ширина и высота изображения разделяются на 10 после декодирования BitmapFactory
. Для другого изображения я перехожу от 3480x4640 до 217x290, поэтому деление на 16. Сначала я подумал, что это может быть вызвано метаданными dpi, поэтому я попытался заставить его при открытии изображения с помощью следующего кода:
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 1 << degradation;
opts.inScaled = false;
opts.inDensity = 1;
opts.inTargetDensity = 1;
opts.inScreenDensity = 1;
final Bitmap original = BitmapFactory.decodeByteArray(data, 0, data.length, opts);
Log.d(Tags.IMAGES, "Opening received image of size " + data.length + " degradation " + degradation + " decoded " + original.getWidth() + "x" + original.getHeight());
Поскольку вы можете видеть количество байтов (2 МБ), которые я даю, BitmapFactory
соответствует большому изображению, не имеющему изображение размером 300x200 пикселей. Поэтому мой код загрузки и код загрузки верны. У меня есть правильные данные перед декодированием.
Я заставил все плотности избежать масштабирования, а также отключил масштабирование, и мой размер выборки равен 1, так как моя деградация равна 0, поэтому я не заставляю какую-либо подвыборку. Я по-прежнему заканчиваю очень маленьким изображением. И BitmapFactory.decodeByteArray
быстро вызывает собственный код, поэтому я не могу его отладить.
Я старался:
- устанавливает всю плотность в объекте
BitmapFactory.Options
на 0, но это ничего не меняет. - устанавливая плотность растрового изображения перед загрузкой, никакого эффекта (первоначально эти два подвыбранных изображения имели плотность 420).
- считывая размер растрового изображения до его полного декодирования (через justDecodeBounds), и размер, возвращенный таким образом, также слишком мал.
- не передавать никаких параметров в метод
decodeByteArray
, но изображение слишком мало.