[P&AM Lab] Исправленный imgfilter

Grigoriy A. Sitkarev sitkarev на komitex.ru
Ср Май 4 03:05:47 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 
переделан, так что можно его стаскивать, собирать и играться.

Имейте в виду что код далёк от оптимума -- это хороший педагогический 
пример чтобы было понятно как читать и записывать изображения, 
использовать разделяемые фильтры и конволюцию (свёртку).

--
Г.А.




Подробная информация о списке рассылки Lab