|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Oleg Goodyckov 2:5020/400 23 Dec 2002 14:18:23 To : Ilya Anfimov Subject : Re: XCreateImage и XPutImage -------------------------------------------------------------------------------- On Sun, Dec 22, 2002 at 04:45:18PM +0000, Ilya Anfimov wrote: > > > >Проблема есть такая: читаю из файла в память картинку размерами > >768 х 576 х 24 (то есть на пиксель - 3 байта). Создаю процедурой > >XCreateImage имидж и процедурой XPutImage вывожу его в окно размерами > >192 х 144. > > > >По высоте получается все хорошо. Hо по ширине картинка получается втрое > >шире. И происходит сие потому, что каждый байт строки исходного > >изображения отображается в отдельный пиксель целевой картинки. Так что она > >состоит из вертикальных полос красного, зеленого и синего цветов, > >промодулированных по яркости. То есть все, как положенно, но почему байт > >попадает в пиксель? > >Впечатление такое, что какая-то из сабжевых процедур воспринимает исходную > >картинку не как 24-разрядную, а как 8-разрядную. Hо > >Screen->root_visual->bits_per_rgb я устанавливал в 24 и никакого > >результата оно не дало. То есть, отношения к делу не имееют. > > > >Кто подскажет, где чего крутить? > > 1) Первый вариант при таких приколах -- посмотреть на те > творения, где всё работает. Hу не знаю, например, на display от > ImageMagick какой-нибудь. Собственно, с работающего примера и слизано. Только там исходная картинка имеет те же размеры, что и целевая. Так что преобразований форматов не требуется. В остальном - все один к одному. > 2) X11 в этом месте работает как описано в документации. > Следовательно, глюки у тебя. Следовательно, без примера кода это > обсуждение будет весьма отвлечённым. Ты имеешь в виду мой код? Вот он. Место, где создается: src1_win.c_image = XCreateImage (XtDisplay (src1_win.root), DefaultVisual (XtDisplay(src1_win.root), 0), 24, ZPixmap,0, (char*)src1_win.source->channels(1)->frame, src1_win.source->vfmt.fmt.pix.width, // исх. ширина - 768 src1_win.source->vfmt.fmt.pix.height,16, // исх. высота - 576 src1_win.source->vfmt.fmt.pix.width*3*4); // 768/192=4 - новая // ширина Место, где отрисовывается: XPutImage (XtDisplay (src1_win.c_view), XtWindow (src1_win.c_view), src1_win.gc, src1_win.c_image, 0, 0, 0, 0, 192, 144); 192x144 - размеры целевой картинки. > Кстати, и твоё рассуждение о промодулированных полосах мне тоже > кажется несколько расплывчатым. Как же его уточнить? Hу вот, к примеру, беру Гимп, захватываю картинку, которую отрисовываю выше приведенным кодом, увеличиваю и рассматриваю. Вижу, что вся картинка состоит из вертикальных чредующихся полос - красного, зеленого и синего цвета. Полосы промодулированы по яркости и имеют ширину один пиксель. Из чего я делаю вывод, что в этот пиксель попадает байт исходного изображения. А он как, известно, описывает яркость именно какого-то одного цвета. По этой же причине целевая картинка получается втрое шире. Что я еще могу уточнить? > 3) Кстати, в качестве отвлечённого обсуждения: ты случайно for- > mat как XYPixmap не поставил? А то привычное ещё с DOSовых времён > расположение -- это ZPixmap. ZPixmap, как указано выше. --- ifmail v.2.15dev5 * Origin: unknown (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/1864326f5b6b8.html, оценка из 5, голосов 10
|