|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Ilya Anfimov 2:5020/400 25 Dec 2002 18:39:34 To : Oleg Goodyckov Subject : Re: XCreateImage и XPutImage -------------------------------------------------------------------------------- On Mon, 23 Dec 2002 10:18:23 +0000 (UTC), Oleg Goodyckov <og@videoproject.kiev.ua> wrote: >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 и никакого >> >результата оно не дало. То есть, отношения к делу не имееют. А зачем ты его устанавливал там? Оно вообще так не ставится. Hасколько я помню, в XFree оно меняется только при старте сервера. Возможно, что ещё в конфигах где-нибудь есть. И во всяком случае не отдельные элементы, а только в целом на одно из поддерживаемых сервером. >> > >> >Кто подскажет, где чего крутить? >> >> 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 - новая Последней строчки совсем не понял. Откуда тут ещё "*4" взялось? И два момента кстати: во-первых, я всегда опасался XCreateImage. Там же вроде написано, что он byte_order и bits_order с сервера берёт? С этим же заколебёшься разбирать, если картинка не с того же сервера получена. Хотя это, конечно, может быть и враньё. И по этому же поводу: bitmap_unit для TrueColor у XFree обычно 32. То есть "r,g,b,пропуск". А ты случайно там подряд "r,g,b,r,g,b,..." не зафигачил? Если так, то многое стало бы понятнее. Во-вторых, а чего у тебя bitmap_pad всего 16? Hе, это мелочь вроде и рояли не играет, но все вроде сейчас тоже в 32 на True- Color ставят. Хотя это совсем мелочь, насколько я понимаю. > // ширина > >Место, где отрисовывается: > 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 - размеры целевой картинки. [skipped] > --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/1511544212fe.html, оценка из 5, голосов 10
|