memory heap
394 subscribers
2.74K photos
575 videos
53 files
3.37K links
science ∩ art = wonder

all memory blocks here are allocated by @a_v_p

GitHub: https://github.com/artyom-poptsov
Mastodon: https://fosstodon.org/@avp

https://memory-heap.org/~avp/
Download Telegram
🔥3
Как оказалось, инверсия цветов в Guile-PNG не всегда работает корректно. В результате получаются вот такие артефакты.

(Парсер PNG, как же я тебя понимаю 😐)

#projects #guile #png #parser #lisp
😁3
Измеряю качество обработки изображений в самописной библиотеке PNG с помощью шакалов. 9 шакалов из 9, я считаю.

#projects #guile #png #parser #lisp
👍4
memory heap
Измеряю качество обработки изображений в самописной библиотеке PNG с помощью шакалов. 9 шакалов из 9, я считаю. #projects #guile #png #parser #lisp
Сверхточный шакал измерения, используемый для оценки качества обработки изображений.
Краткая (пока что) статья про настройку подключения к сети Yggdrasil на сайте хакерспейса CADR:
https://cadrspace.ru/w/index.php?title=Yggdrasil

#yggdrasil #network #mesh
😈2❤‍🔥1
memory heap
HELLO HUMAN. #projects #guile #png #parser #lisp
PNG формат подразумевает прогон исходных данных изображения перед компрессией через фильтры, чтобы эту самую компрессию сделать более эффективной. RFC 2083 описывает 5 типов фильтров (от 0 до 4).

Также PNG оперирует таким понятием, как "линии сканирования" (scanlines). Изображение делится на эти линии сканирования, каждая из которых описывает одну строку растрового изображения. При этом, после декомпрессии данных изображения каждая линия на 1 байт длинее, чем фактический размер данных одной строки изображения, т.к. в начале линии сканирования находится байт, содержащий тип фильтра, применённого к данной строке.

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

Иными словами, если у вас цветное изображение 10х10 пикселей, при этом каждый пиксель кодируется тремя байтами (RGB-формат, 8 бит на цвет), то длина строки сканирования вместе с начальным байтом фильтра будет
10 писелей * 3 байта на пиксель + 1 байт типа фильтра = 31 байт


Тогда как конечное изображение после обратного применения фильтра будет иметь размер строки:
10 писелей * 3 байта на пиксель = 30 байт


Типы фильтров для каждой строки изображения выбираются кодировщиком PNG исходя из соображений эффективности сжатия (стандарт RFC 2083 про это говорит отдельно.) То есть, в рамках одного изображения к разныем строкам могут применяться разные фильтры.

На данном этапе у меня возникают ошибки именно из-за того, что я неправильно работаю с этими фильтрами.

#png #format
👍2🔥1
Уже лучше.

#projects #guile #png #parser
Наконец-то получилось корректно декодировать изображение PNG, где встречаются все 5 видов фильтров.

По поводу корректности обработки альфа-канала пока не уверен, нужны ещё тесты.

А вот здесь вы можете увидеть результат обработки декодированного изображения — инверсии цветов.

\o/

#projects #guile #png #parser
🔥4