![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Есть серый растр, 16 бит. Можно ли его отобразить средствами GDI как есть?
-------------------- ... |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
в смысле, вывести битмап, каждый пиксел которого хранит только одну компоненту?
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
Earnest, нельзя, если в текущем режиме глубина 1 канала 8разрядов, то 16никак не нарисовать
и я вообще не уверен что существуют режимы экрана с 16-разрядными каналами, и что существуют мониторы которые смогут отобразить 48-разрядный цвет однако, можно увеличить разрешение изображения, и использовать дизеринг (http://en.wikipedia.org/wiki/Dither#Digital_photography_and_image_processing) |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а число битов-то я и не заметил )
можно в принципе помучить GradientFill, но все равно придется готовить растр, проще масштабировать обратно в 8 бит -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
По описанию диб-секций и прочей лабуды в MSDN получается, что 16-битный растр можно выводить только цветным (по 5 бит или масками задавать), а серый никак. Потому и спрашиваю, что ничего не нашла.
Ну ладно, в принципе сколько уровней серости отобразить, не сильно важно, все равно никто не различит 64000 оттенков, и 256-то дай бог. Но тогда проблема в другом: как быстро отображать. Понятно, что можно преобразовать в 8-битный. Но не хочется (нельзя) терять информацию. Т.е. обрабатывать нужно все-таки 16 бит, а для вывода нужно 8. Очевидный выход - завести еще один растр, для просмотра. Но жаба душит. Растры немаленькие (космо-снимки). А на лету (при отображении) делать то же самое - боюсь, притормаживать вывод будет. Тем более, что нужно не просто отшибать младший байт, но и, возможно, делать какую-то обработку, чтобы полностью использовать диапазон 8 бит, типа гамма-коррекции или растягивания гистограммы. Собственно, это стандартный прием систем, которые снимки показывают\обрабатывают. Но как это делается, что-то не могу найти \ понять. Например, ArcView это умеет. И делает быстро (реагирует на переключение режима просмотра). Что при ее общей неповоротливости работы с растрами настораживает. А ведь надо пройтись по каждому пикселу немаленького растра. Может, кто-то знает? Или есть какие-то идеи? Фотошоп, например, как 16-битную серость рисует? Ну он-то точно памяти отжирает раза в 3 больше для каждого растра, но нем не менее... -------------------- ... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
OpenGL умеет работать с такими растрами, но в любом случае он преобразует все в свой внутренний формат. Кое что по преобразованиям есть тут http://www.progz.ru/forum/index.php?showto...&pid=187140 . Сам вопрос я не изучал, но в аргументах функций встречается формат GL_RGB16, GL_LUMINANCE16 и т.д. Добавлено через 7 минут и 16 секунд C GDI можно максимум сделать так, оформить маски для RGB как 0xFFFF, 0x0000, 0x0000 и нарисовать все красным цветом вместо серого. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
при преобразовании 16 бит в 8 информация потеряется по определению.
если хочется сохранить малые уровни сигнала - то можно использовать логарифмическое сжатие. логарифм быстрее всего считать таблицей. времени это займет наверное всего лишь раза в полтора-два больше чем простое копирование |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Для быстрого преобразования 16->8 скорее всего применяется SSE. Там вроде есть такие команды группового преобразования (на 64х битах будет по 4 пиксела зараз)
|
|||
|
||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Не, этот вариант рассматривался, но не катит, хотя бы потому, что нужно не просто младший байт отшибить. Да хотя бы учесть, что в младшем (больше или меньше половины - округлить, так сказать). Да и вывод красным - брр... Информацию по ссылке посмотрю, спасибо.
Это очевидно, но потери допустимы только при отображении, а внутри, стало быть, придется хранить 2 растра... задавив жабу. xvr, а при этом можно всякие хитрые преобразования делать (в смысле можешь ссылку дать на описание)? Скорее уж проще один раз таблицу нарисовать, 64К это ерунда по сравнению с остальным. -------------------- ... |
||||
|
|||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 12 Всего: 121 |
А самый простой вариант: отобразить значения в интервал 0..1 потом умножить на 255 не пойдёт?
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
И картинка из 16ти битной превратиться в 32х битную Добавлено через 16 секунд Экономия на лицо -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
не, простое масштабирование - это без операций с плавающей точкой, т.е. ( gray_x16 * 0xff) / 0xffff или просто:
но я склоняюсь к мнению xvr, т.е. логичнее использовать доступные расширения -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
сразу видно математиков ;)
Добавлено через 1 минуту и 12 секунд GremlinProg, в чем сакральный смысл умножать на 2^8-1 и делить на 2^16-1 ? Добавлено через 6 минут и 5 секунд Earnest, в конечном счете, задача сводится к преобразованию некоторой функцией, которую можно задать в табличном виде если цель - визуализация, подберите такую функцию, для которой на ваш взгляд (или взгляд пользователя) картинка будет нарисована лучше всего. гамма -значит гамма, логарифм - значит логарифм или, еще раз повторюсь, если увеличить размер пиксела (и изображения) в 2^n раз, можно отобразить на экране на все 16бит |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 12 Всего: 121 |
Alexeis, так это промежуточная операция.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |