Получить X / Y позицию пикселя в файле PNG - PullRequest
0 голосов
/ 11 февраля 2020

После удаления байтов заголовка и распаковки значений пикселей, файл PNG оставляет нам ряд строк (горизонтальная полоса изображения высотой в один пиксель).

Каждая строка начинается с одного байта, определяющего используемый фильтр, за которым следуют значения RGB:

+-----+-----+-----+-----+-----+-----+-----+
| 0:F | 1:R | 2:G | 3:B | 4:R | 5:G | 6:B |    // end of first row in image
+-----+-----+-----+-----+-----+-----+-----+
| 7:F | 8:R | 9:G |10:B |11:R |12:G |13:B |    // end of second row
+-----+-----+-----+-----+-----+-----+-----+

В изображении без байта фильтра я мог бы просто разделить индекс на 3 (так как есть три значения на пиксель RGB), затем используйте эти формулы, чтобы получить положение x / y этого пикселя:

x = index % width
y = index / width

Но байт фильтра меня отбрасывает! Как я могу получить x / y позицию пикселя, учитывая индекс байта красного пикселя? (Скажите в байте 4 или в байте 11, как показано выше.)

Я пробовал все виды перестановок, но я думаю, что должно быть элегантное решение!

1 Ответ

1 голос
/ 11 февраля 2020

Основываясь на комментариях от @ usr2564301, я думаю, что это работает правильно:

y = ((index-1) / 3) / width
x = ((index-y) / 3) % width

Где width - ширина изображения в пикселях, а не ширина строки байтов.

Мы вычитаем y из index, потому что каждая строка имеет один байт фильтра, и нам нужно удалить их все, чтобы получить позицию x.

В качестве альтернативы, можно вычислить y используя:

y = index / row_width

Где row_width - количество байтов в строке: три для RGB и один байт фильтра, умноженный на ширину изображения.

...