Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отобразить серый растр 16-бит - как? 
V
    Опции темы
Earnest
Дата 6.4.2010, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Есть серый растр, 16 бит. Можно ли его отобразить средствами GDI как есть? 


--------------------
...
PM   Вверх
GremlinProg
Дата 6.4.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



в смысле, вывести битмап, каждый пиксел которого хранит только одну компоненту?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 6.4.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



Earnest, нельзя, если в текущем режиме глубина 1 канала 8разрядов, то 16никак не нарисовать
и я вообще не уверен что существуют режимы экрана с 16-разрядными каналами, и что существуют мониторы которые смогут отобразить 48-разрядный цвет

однако, можно увеличить разрешение изображения, и использовать дизеринг
(http://en.wikipedia.org/wiki/Dither#Digital_photography_and_image_processing)
PM MAIL ICQ   Вверх
GremlinProg
Дата 6.4.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



а число битов-то я и не заметил )

можно в принципе помучить GradientFill, но все равно придется готовить растр,
проще масштабировать обратно в 8 бит


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 7.4.2010, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



По описанию диб-секций и прочей лабуды в MSDN получается, что 16-битный растр можно выводить только цветным (по 5 бит или масками задавать), а серый никак. Потому и спрашиваю, что ничего не нашла. 
Ну ладно, в принципе сколько уровней серости отобразить, не сильно важно, все равно никто не различит 64000 оттенков, и 256-то дай бог.
Но тогда проблема в другом: как быстро отображать. Понятно, что можно преобразовать в 8-битный. Но не хочется (нельзя) терять информацию. Т.е. обрабатывать нужно все-таки 16 бит, а для вывода нужно 8. 
Очевидный выход - завести еще один растр, для просмотра. Но жаба душит. Растры немаленькие (космо-снимки). А на лету (при отображении) делать то же самое - боюсь, притормаживать вывод будет. Тем более, что нужно не просто отшибать младший байт, но и, возможно, делать какую-то обработку, чтобы полностью использовать диапазон 8 бит, типа гамма-коррекции или растягивания гистограммы.
Собственно, это стандартный прием систем, которые снимки показывают\обрабатывают. 
Но как это делается, что-то не могу найти \ понять.
Например, ArcView это умеет. И делает быстро (реагирует на переключение режима просмотра). Что при ее общей неповоротливости работы с растрами настораживает. А ведь надо пройтись по каждому пикселу немаленького растра.
Может, кто-то знает? Или есть какие-то идеи?
Фотошоп, например, как 16-битную серость рисует? Ну он-то точно памяти отжирает раза в 3 больше для каждого растра, но нем не менее...


--------------------
...
PM   Вверх
Alexeis
Дата 7.4.2010, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(Earnest @  7.4.2010,  08:01 Найти цитируемый пост)
Фотошоп, например, как 16-битную серость рисует? Ну он-то точно памяти отжирает раза в 3 больше для каждого растра, но нем не менее... 

  OpenGL умеет работать с такими растрами, но в любом случае он преобразует все в свой внутренний формат. Кое что по преобразованиям есть тут http://www.progz.ru/forum/index.php?showto...&pid=187140 . Сам вопрос я не изучал, но в аргументах функций встречается формат GL_RGB16, GL_LUMINANCE16 и т.д.

Добавлено через 7 минут и 16 секунд
C GDI можно максимум сделать так, оформить маски для RGB как 0xFFFF, 0x0000, 0x0000 и нарисовать все красным цветом вместо серого.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GoldFinch
Дата 7.4.2010, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



при преобразовании 16 бит в 8 информация потеряется по определению.
если хочется сохранить малые уровни сигнала - то можно использовать логарифмическое сжатие.
логарифм быстрее всего считать таблицей.
времени это займет наверное всего лишь раза в полтора-два больше чем простое копирование
PM MAIL ICQ   Вверх
xvr
Дата 7.4.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Для быстрого преобразования 16->8 скорее всего применяется SSE. Там вроде есть такие команды группового преобразования (на 64х битах будет по 4 пиксела зараз)

PM MAIL   Вверх
Earnest
Дата 7.4.2010, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(Alexeis @  7.4.2010,  10:57 Найти цитируемый пост)
C GDI можно максимум сделать так, оформить маски для RGB как 0xFFFF, 0x0000, 0x0000 и нарисовать все красным цветом вместо серого.

Не, этот вариант рассматривался, но не катит, хотя бы потому, что нужно не просто младший байт отшибить. Да хотя бы учесть, что в младшем (больше или меньше половины - округлить, так сказать). Да и вывод красным - брр...
Информацию по ссылке посмотрю, спасибо.
Цитата(GoldFinch @  7.4.2010,  11:10 Найти цитируемый пост)
при преобразовании 16 бит в 8 информация потеряется по определению.

Это очевидно, но потери допустимы только при отображении, а внутри, стало быть, придется хранить 2 растра... задавив жабу.

xvr, а при этом можно всякие хитрые преобразования делать (в смысле можешь ссылку дать на описание)? 
Скорее уж проще один раз таблицу нарисовать, 64К это ерунда по сравнению с остальным.


--------------------
...
PM   Вверх
W4FhLF
Дата 7.4.2010, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



А самый простой вариант: отобразить значения в интервал 0..1 потом умножить на 255 не пойдёт? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Alexeis
Дата 7.4.2010, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(W4FhLF @  7.4.2010,  10:55 Найти цитируемый пост)
А самый простой вариант: отобразить значения в интервал 0..1

И картинка из 16ти битной превратиться в 32х битную smile .

Добавлено через 16 секунд
Экономия на лицо


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GoldFinch
Дата 7.4.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



W4FhLF, это называется отбросить младшие 8 бит

переводим в 0..1
x1 = (x / 2^16) 
домножаем на 256
x2 = x1 * 256 = x / 2^8
округляем
x3 = round(x / 2^8) = x shr 8

Это сообщение отредактировал(а) GoldFinch - 7.4.2010, 12:15
PM MAIL ICQ   Вверх
GremlinProg
Дата 7.4.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



не, простое масштабирование - это без операций с плавающей точкой, т.е. ( gray_x16 * 0xff) / 0xffff или просто:
Код

MulDiv( gray_x16, 0xff, 0xffff )

но я склоняюсь к мнению xvr, т.е. логичнее использовать доступные расширения


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 7.4.2010, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



сразу видно математиков ;)

Добавлено через 1 минуту и 12 секунд
GremlinProg, в чем сакральный смысл умножать на 2^8-1 и делить на 2^16-1  ?

Добавлено через 6 минут и 5 секунд
Earnest, в конечном счете, задача сводится к преобразованию некоторой функцией, которую можно задать в табличном виде
если цель - визуализация, подберите такую функцию, для которой на ваш взгляд (или взгляд пользователя) картинка будет нарисована лучше всего.
гамма -значит гамма, логарифм - значит логарифм

или, еще раз повторюсь, если увеличить размер пиксела (и изображения) в 2^n раз, можно отобразить на экране на все 16бит
PM MAIL ICQ   Вверх
W4FhLF
Дата 7.4.2010, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Alexeis, так это промежуточная операция. smile 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0643 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.