#1
|
|||
|
|||
Re: XCreateImage и XPutImage
Ilya Anfimov написал(а) к Oleg Goodyckov в Dec 02 19:45:18 по местному времени:
From: ilan@adt.ru (Ilya Anfimov) On Thu, 19 Dec 2002 14:58:27 +0000 (UTC), Oleg Goodyckov <og@videoproject.kiev.ua> wrote: >Привет всем! > >Что-то не пойму, было это сообщение в эхе или нет? Вроже отправлял, но не >видел. Было. > >Проблема есть такая: читаю из файла в память картинку размерами >768 х 576 х 24 (то есть на пиксель - 3 байта). Создаю процедурой >XCreateImage имидж и процедурой XPutImage вывожу его в окно размерами >192 х 144. > >По высоте получается все хорошо. Но по ширине картинка получается втрое >шире. И происходит сие потому, что каждый байт строки исходного >изображения отображается в отдельный пиксель целевой картинки. Так что она >состоит из вертикальных полос красного, зеленого и синего цветов, >промодулированных по яркости. То есть все, как положенно, но почему байт >попадает в пиксель? >Впечатление такое, что какая-то из сабжевых процедур воспринимает исходную >картинку не как 24-разрядную, а как 8-разрядную. Но >Screen->rootvisual->bits_perrgb я устанавливал в 24 и никакого >результата оно не дало. То есть, отношения к делу не имееют. > >Кто подскажет, где чего крутить? 1) Первый вариант при таких приколах -- посмотреть на те творения, где всё работает. Ну не знаю, например, на display от ImageMagick какой-нибудь. 2) X11 в этом месте работает как описано в документации. Следовательно, глюки у тебя. Следовательно, без примера кода это обсуждение будет весьма отвлечённым. Кстати, и твоё рассуждение о промодулированных полосах мне тоже кажется несколько расплывчатым. 3) Кстати, в качестве отвлечённого обсуждения: ты случайно for- mat как XYPixmap не поставил? А то привычное ещё с DOSовых времён расположение -- это ZPixmap. >Заранее благодарен. --- ifmail v.2.15dev5 |
#2
|
|||
|
|||
Re: XCreateImage и XPutImage
Ilya Anfimov написал(а) к Oleg Goodyckov в Dec 02 20:38:44 по местному времени:
From: ilan@adt.ru (Ilya Anfimov) On Sat, 28 Dec 2002 08:07:25 +0000 (UTC), Oleg Goodyckov <og@videoproject.kiev.ua> wrote: >On Wed, Dec 25, 2002 at 02:39:34PM +0000, Ilya Anfimov wrote: >> On Mon, 23 Dec 2002 10:18:23 +0000 (UTC), [грустное skipped] >> > src1win.c_image = XCreateImage (XtDisplay (src1win.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.width34); // 768/192=4 - новая >> >> Последней строчки совсем не понял. Откуда тут ещё "*4" взялось? > >Ну так строка ведь должна быть в четверо длиннее, если я хочу сжать >картинку по вертикали вчетверо. Во-первых, на XCreateImage то, что ты потом будешь делать не влияет. Во-вторых... Ну об этом после. > >> И два момента кстати: во-первых, я всегда опасался XCreateImage. > >А что использовать взамен? XInitImage > >> Там же вроде написано, что он byteorder и bitsorder с сервера >> берёт? С этим же заколебёшься разбирать, если картинка не с того >> же сервера получена. Хотя это, конечно, может быть и враньё. И >> по этому же поводу: bitmap_unit для TrueColor у XFree обычно 32. >> То есть "r,g,b,пропуск". А ты случайно там подряд >> "r,g,b,r,g,b,..." не зафигачил? Если так, то многое стало бы >> понятнее. >> Во-вторых, а чего у тебя bitmap_pad всего 16? Не, это мелочь >> вроде и рояли не играет, но все вроде сейчас тоже в 32 на True- >> Color ставят. Хотя это совсем мелочь, насколько я понимаю. > >Проверял. Не играет. >Да и не понял, что это за цифра такая? В доке ну очень кратенько о ней >сказано. > >Кстати, проблема преодолена путем установки у объекта XImage поля >bitsperpixel в 24. Сразу после вызова XCreateImage оно равнялось 32. Угу. Примерно то, что я сказал "во-первых". Только, разумеется, bitsper_pixel, а не bitmapunit. Запамятовал за давностью. Так вот: так делать нельзя. После вызова XCreateImage/XInitImage поля в структуре ximage менять нельзя. Без добавочных вызовов XInitImage/XDestroyImage. > > >Но проблема переродилась в другую. Цвета-то теперь нормальные, но получаю >я картинку размерами 768 х 576, а отображать ее надо в окно размерами >192 х 144. То есть, в четверо сжатой по обеим размерностям. Сжимать ее >самому на месте - медленно выходит. Но специальных возможностей - типа >создать XImage с исходными размерами, а отобразить через XPutImage с >требуемыми, и чтобы оно там само с максимальной скоростью это сделало - >нету. Нашел только одну фишку - регионы. Но, во-первых, это дополнительная >операция, а во-вторых, никак не пойму, как этот регион из моей картинки >создать. В документации об этом - ни слова. Или я не нашел. Читаю штатное >описание /usr/share/doc/XFree86-doc-4.2.0/X11/xlib.PS, приходящее вместе с >X11. Так вот, регионы здесь не при чём. Способов изменять размеры/ поворачивать картинки в CORE Protocol нет. Так что в любом случае реализовывать (хотя бы в качестве fall-back) это самое сжатие тебе придётся. Кстати, в четыре-то раза -- что ты там такое делаешь, что оно тормозит? Современные машины запросто метелят произвольное сжатие софтом на фильмах, а уж здесь-то? Но если так хочется аппаратного ускорения, то это есть в некоторых расширениях, самые известные из них -- glx, XIE. Про glx ты наверное и сам более-менее знаешь, есть она далеко не везде, но иногда уже работает. Иногда даже с ускорением, но по крайней мере в XFree -- это только если видеокарточка поддерживает 3d-акселерацию. Несколько интереснее ситуация с XIE. Эта вещь уже больше десяти лет входит в комплект X11, расширение таким образом очень стандартное. Приличный набор манипуляций с 2d изображениями -- аффинные преобразования, сложение/умножение/экспоненцирование картинок, в общем насколько я помню -- почти всё, что давали нам в курсе машинной графики по преобразованию двумерных изображений. Но в XFree этим целенаправленно никто не занимался, ускорения ни для каких (кажется) карточек не сделали. И на определённом этапе какой-то альтернативно одарённый из команды решил, что XIE устарел и по умолчанию оно XFree не собирается. Вообще, одарённость команды, отвечающей за ядро XFree по-видимому исключительно альтернативная -- столько всякой радости они понаделали в последний пару-тройку лет. --- ifmail v.2.15dev5 |
#3
|
|||
|
|||
Re: XCreateImage и XPutImage
Oleg Goodyckov написал(а) к Ilya Anfimov в Dec 02 11:07:24 по местному времени:
From: Oleg Goodyckov <og@videoproject.kiev.ua> On Wed, Dec 25, 2002 at 02:39:34PM +0000, Ilya Anfimov wrote: > On Mon, 23 Dec 2002 10:18:23 +0000 (UTC), > >> >По высоте получается все хорошо. Но по ширине картинка получается втрое > >> >шире. И происходит сие потому, что каждый байт строки исходного > >> >изображения отображается в отдельный пиксель целевой картинки. Так что она > >> >состоит из вертикальных полос красного, зеленого и синего цветов, > >> >промодулированных по яркости. То есть все, как положенно, но почему байт > >> >попадает в пиксель? > >> >Впечатление такое, что какая-то из сабжевых процедур воспринимает исходную > >> >картинку не как 24-разрядную, а как 8-разрядную. Но > >> >Screen->rootvisual->bits_perrgb я устанавливал в 24 и никакого > >> >результата оно не дало. То есть, отношения к делу не имееют. > > А зачем ты его устанавливал там? Оно вообще так не ставится. Для пробы. Ну там чтобы подергать, посмотреть на реакцию. Изучить в общем. Так что результат получился отрицательным. Или положительным: не влияет. > Насколько я помню, в XFree оно меняется только при старте > сервера. Возможно, что ещё в конфигах где-нибудь есть. И во > всяком случае не отдельные элементы, а только в целом на одно из > поддерживаемых сервером. > > > src1win.c_image = XCreateImage (XtDisplay (src1win.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.width34); // 768/192=4 - новая > > Последней строчки совсем не понял. Откуда тут ещё "*4" взялось? Ну так строка ведь должна быть в четверо длиннее, если я хочу сжать картинку по вертикали вчетверо. > И два момента кстати: во-первых, я всегда опасался XCreateImage. А что использовать взамен? > Там же вроде написано, что он byteorder и bitsorder с сервера > берёт? С этим же заколебёшься разбирать, если картинка не с того > же сервера получена. Хотя это, конечно, может быть и враньё. И > по этому же поводу: bitmap_unit для TrueColor у XFree обычно 32. > То есть "r,g,b,пропуск". А ты случайно там подряд > "r,g,b,r,g,b,..." не зафигачил? Если так, то многое стало бы > понятнее. > Во-вторых, а чего у тебя bitmap_pad всего 16? Не, это мелочь > вроде и рояли не играет, но все вроде сейчас тоже в 32 на True- > Color ставят. Хотя это совсем мелочь, насколько я понимаю. Проверял. Не играет. Да и не понял, что это за цифра такая? В доке ну очень кратенько о ней сказано. Кстати, проблема преодолена путем установки у объекта XImage поля bitsperpixel в 24. Сразу после вызова XCreateImage оно равнялось 32. Но проблема переродилась в другую. Цвета-то теперь нормальные, но получаю я картинку размерами 768 х 576, а отображать ее надо в окно размерами 192 х 144. То есть, в четверо сжатой по обеим размерностям. Сжимать ее самому на месте - медленно выходит. Но специальных возможностей - типа создать XImage с исходными размерами, а отобразить через XPutImage с требуемыми, и чтобы оно там само с максимальной скоростью это сделало - нету. Нашел только одну фишку - регионы. Но, во-первых, это дополнительная операция, а во-вторых, никак не пойму, как этот регион из моей картинки создать. В документации об этом - ни слова. Или я не нашел. Читаю штатное описание /usr/share/doc/XFree86-doc-4.2.0/X11/xlib.PS, приходящее вместе с X11. --- ifmail v.2.15dev5 |