сжатие изображения с использованием оптимизированного PNG-изображения небольшого размера - PullRequest
0 голосов
/ 22 сентября 2018

Я храню данные в изображениях, где каждый пиксель представляет точку данных (ключ: пары значений).Расположение пикселя представляет «ключ», а цвет пикселя представляет числовое «значение».Пример данных будет выглядеть следующим образом:

| key  | value |
| ---- | ----- |
| A    | 255   |
| B    | 1000  |
| C    | 20000 |
| D    | 15    |

Данные будут преобразованы в пиксельные данные следующим образом:

| pixel location | r,g,b   |
| -------------- | ------- |
| 0,0            | 0,0,255 |
| 0,1            | 0,3,232 |
| 1,0            | 0,78,32 |
| 1,1            | 0,0,15  |

Отображение точек в местоположениях пикселей выполняется с помощью aформула и определенная точка данных, «ключ», всегда отображаются в одно и то же положение пикселяПреобразование числового значения в r, g, b выполняется путем преобразования числа в 24 бита, а затем деления его на 8-битные порции и преобразования обратно в числовое значение, чтобы получить значения r, g, b.Ниже приведено фактическое изображение, содержащее 65536 точек данных в 256x256px

vgy.me-s5HkyL

Если я подготовлю другой набор данных, в котором «ключи» отсортированы, а их ранг назначен как «значение», то яполучим такую ​​таблицу (показано только 4 строки):

| key  | value(**rank**) | r,g,b |
| ---- | --------------- | ----- |
| A    | 0               | 0,0,0 |
| B    | 1               | 0,0,1 |
| C    | 2               | 0,0,2 |
| D    | 3               | 0,0,3 |

Если я подготовлю таблицу рангов для 65536 точек данных и преобразую в изображение, то получу

vgy.me-EtlqNf

Теперь интересная часть, второе изображение имеет то же количество пикселей и содержит больше цветовых значений, но занимает меньше места (первое изображение - 158 КБ, второе изображение - 1,2 К ).Я предполагаю, что это из-за формулы, которую я использую, которая совпадает с алгоритмом сжатия PNG.

Итак, мой вопрос, используя второе изображение в качестве маски, учебника для начинающих и т. Д., Можем ли мы сделать первое изображение, чтобы занимать меньше места?Я пробовал XOR [1] между двумя изображениями, но это не помогло.Моя общая цель - сохранить пары ключ-значение в изображении без потерь с минимально возможным размером изображения.

[1]: почему XOR?потому что мне нужен способ, который обратим, я не хочу потерять исходные данные

...