<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[ПЭВМ "Агат" 7-9: Форум &mdash; Преобразование изображений в формат Apple HiRes]]></title>
		<link>https://forum.agatcomp.ru//viewtopic.php?id=416</link>
		<atom:link href="https://forum.agatcomp.ru/extern.php?action=feed&amp;tid=416&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Преобразование изображений в формат Apple HiRes».]]></description>
		<lastBuildDate>Wed, 15 Sep 2021 12:59:37 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Преобразование изображений в формат Apple HiRes]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=5898#p5898</link>
			<description><![CDATA[<p><span class="postimg"><img src="http://forum.agatcomp.ru//misc.php?action=pun_attachment&amp;item=1026&amp;download=0" alt="http://forum.agatcomp.ru//misc.php?action=pun_attachment&amp;amp;item=1026&amp;amp;download=0" /></span></p><p>Преобразование изображений в палитру с меньшим количеством цветов, чем в оригинале, давно и широко применяется. Например, один из самых старых алгоритмов диффузии ошибки <a href="https://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering">Флойда-Стайнберга</a> даёт хорошие результаты.</p><p>Трудность с преобразованием в режим HiRes заключается в том, что невозможно выбрать цвет одного пикселя, не повлияв на соседние. Мешает и реализация белого цвета, и заливка, и необходимость выбирать палитру для целого септета пикселей сразу.</p><p>Я не нашел способа распределять ошибку в пределах строки, как это делает Флойд. Поэтому ошибки диффундируют только вниз.</p><p>Цвета квантуются блоками по 7 пикселей, соответствующих одному байту в HiRes. Перебираются все значения байта, а также все варианты комбинаций младшего и старшего битов в следующем байте. Предыдущий байт уже известен на момент вычисления, поэтому из него берутся два старших бита. На основе этих данных рассчитываются цвета 9 пикселей с учётом выбранной палитры и правил заливки. Затем вычисляется сумма квадратов расстояний в RGB пространстве между 7 пикселями оригинала и 7 средними пикселями HiRes. Выбирается такое значение байта, для которого это расстояние наименьшее. Два предполагаемых бита следующего байта отбрасываются и после этого не используются.</p><p>Последний шаг приводит к некоторой погрешности. Значение текущего байта выбирается исходя из оптимального содержимого следующего байта. Однако выбор следующего байта не берёт это в расчёт, из-за чего последний пиксель текущего септета может иметь неоптимальный цвет, например белый вместо цветного, или цветной вместо чёрного. На практике результаты получаются довольно хорошие даже с таким недостатком.</p><p>Затем полученная полная строка рендерится согласно правилам HiRes режима.</p><p>Далее используется модифицированный алгоритм Флойда-Стайнберга для диффузии ошибки. Для каждого пикселя <em>k</em> созданной строки вычисляется разница между цветом оригинала и квантованным цветом. Эта ошибка распределяется на 3 пикселя <em>k</em>-1, <em>k</em> и <em>k</em>+1 и добавляется к цветам оригинала в следующей строке.</p><p>Изображения в заголовке темы созданы написанной мной утилитой на Node.js. Исходный код можно взять на GitHub: <a href="https://github.com/snake-scaly/dither-hires">snake-scaly/dither-hires</a></p>]]></description>
			<author><![CDATA[null@example.com (SnakE)]]></author>
			<pubDate>Wed, 15 Sep 2021 12:59:37 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=5898#p5898</guid>
		</item>
	</channel>
</rss>
