[cdev] Исправленный imgfilter
Grigoriy A. Sitkarev
sitkarev на komitex.ru
Ср Май 4 02:56:30 MSK 2011
Приветствую всех.
Андрей Ануфриев нашёл где в программе imgfilter была недоработка,
которая приводила к тому что по диагонали к изображению добавлялась
чёрная полоса если ширина изображения не была кратна 4-м (в пикселях).
За что ему большое спасибо.
Причина в том что некоторые форматы хранения изображений выравнивают
строки с пикселями по границе машинного слова. В программу внесены
изменения, учитывающие это свойство.
1. Высчитывается сколько байтов из строки с пикселами нужно пропустить:
skip = gdk_pixbuf_get_rowstride(pbuf) - w*rowpix;
Здесь w это ширина изображения в пикселах а rowpix количество байт на
одну группу RGB.
2. После обхода одной строки с пикселями добавляется skip.
pp = pix;
for (i = 0; i < h; i++) {
for (j = 0; j < w; j++) {
r[i*w+j] = pp[0];
g[i*w+j] = pp[1];
b[i*w+j] = pp[2];
pp += rowpix;
}
/* skip alignment row bytes */
pp += skip;
}
Здесь в pp адрес по которому хранятся байты изображения а в массивы r, g
и b соответственно извлекаются R, G и B компоненты изображения.
Исходный текст я положил на репозиторий, в каталог dsp/. Makefile
переделан, так что можно его стаскивать, собирать и играться.
Имейте в виду что код далёк от оптимума -- это хороший педагогический
пример чтобы было понятно как читать и записывать изображения,
использовать разделяемые фильтры и конволюцию (свёртку).
--
Г.А.
Подробная информация о списке рассылки cdev