From sitkarev на komitex.ru Wed May 4 02:56:30 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 04 May 2011 02:56:30 +0400 Subject: [cdev] =?utf-8?b?0JjRgdC/0YDQsNCy0LvQtdC90L3Ri9C5IGltZ2ZpbHRlcg==?= Message-ID: <4DC0881E.1030907@komitex.ru> Приветствую всех. Андрей Ануфриев нашёл где в программе 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 переделан, так что можно его стаскивать, собирать и играться. Имейте в виду что код далёк от оптимума -- это хороший педагогический пример чтобы было понятно как читать и записывать изображения, использовать разделяемые фильтры и конволюцию (свёртку). -- Г.А.