BitmapFactory декодирует байты PNG в необработанные данные
Я загружаю данные изображения по сети и, очевидно, они сжаты. Внутри приложения мне нужно, чтобы данные были на 100% точными по отношению к оригиналу. Так, например, для изображения 720x720 мне нужен массив int длиной 518400 или байтовый массив длиной 2073600, где значения не были изменены по сравнению с оригиналом. Поскольку сжатие PNG без потерь, это должно быть возможно. Я заметил, что BitmapFactory применяет некоторые психовизуальные эффекты при декодировании, которые не заметны при просмотре изображения, однако немного измените значения байтов (я предполагаю, что это для скорости и / или лучше визуальный взгляд на экране).
В настоящее время я использую BitmapFactory.decode, а затем перебираю каждый пиксель для создания нового массива из аппроксимации и создания нового растрового изображения с помощью Bitmap.create. Это возможно, потому что на данный момент изображения являются двоичными, а в исходных изображениях - каждый пиксель. либо (r, g, b, 255), либо (0, 0, 0, 0). Я могу найти наиболее распространенный цвет и установить все пиксели с альфа-значениями через некоторое пороговое значение для этого значения RGB. Решение довольно медленное и кажется излишне сложным.
Итак, мой вопрос - есть ли комбинация флагов опций для BitmapFactory.decode, которая возвращает 100% истинное значение к исходному растровому изображению, или я должен сам создать PNG-декодер, чтобы добиться этого?
1 ответ
Попробуйте этот метод:
val opts = BitmapFactory.Options()
opts.inPremultiplied = false
var bitmapDecode = BitmapFactory.decodeByteArray(decode, 0, decode.size, opts)