![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| nelly |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 17.10.2009 Репутация: нет Всего: нет |
Для biBitCount 32 работает. Для 8 при заполнении Bits "...0xC0000005: Access violation writing location 0x00d33000.". Объясните, пожалуйста, как массив заполнять в случае 8 бит на цвет.
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
8 бит - это не unsigned, это BYTE
+ COLORREF и RGBQUAD - не одно и то же + для 8 бит в Bits вобще не должно быть ни каких цветовых характеристик, там только 8-битные индексы в палитру, которая ставится либо при создании диб-секции, в bmiColors, либо отдельно, функцией SetDIBColorTable но первое, конечно - причина подъема исключения, остальное - так, последующие шаги в решении задачи -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| nelly |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 17.10.2009 Репутация: нет Всего: нет |
Спасибо за ответ. С байт работает. Только вот палитры у меня нет) Получается, мне нужно таки использовать 32 или 24? У меня есть просто матрица со значениями цветов пикселей, которые я получила после применения фильтра к 8-битной картинке. Но с 32 картинка выглядит не совсем так, как хотелось бы....В чем может быть проблема?
![]() |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
да, если подразумевается именно такая попиксельная генерация изображения, как в цикле а если требуется все-таки 8бит, их можно получить впоследствии, преобразовав полноцветный растр к 8битному (но уже, как правило, с некоторой потерей в качестве) Добавлено через 3 минуты и 9 секунд но если требуется просто скопировать изображение, то у исходного 8битного уже есть палитра, ее и надо скопировать в bmiColors, тогда лишних преобразований не потребуется -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| nelly |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 17.10.2009 Репутация: нет Всего: нет |
Исходное 8-битное у меня есть, и палитра там есть, мне на это изображение нужно наложить какой-нибудь фильтр(3х3). После того как применила фильтр, как я понимаю, использовать старую палитру нельзя...цвета то другие. Как получить новую палитру у меня никаких идей нет.
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
"Какой-нибудь" фильтр бессмысленно накладывать на палитровое изображение. Маска 3*3 подразумевает свертку или что-то вроде, а эта арифметика с индексами палитры не имеет никакого смысла.
Так что ты не другие цвета получаешь, а просто мусор, просто по определению. Кроме одного случая - серошкального изображения, когда палитра представляет собой (0,0,0), (1,1,1) ... (255,255,255). В этом случае индексы эквивалентны уровню яркости и их вполне можно обсчитывать маской. И палитра при этом не изменяется. В остальных случая изображение нужно преобразовывать в полноцветное (т.е 24 бита) и тогда выполнять преобразования. Затем можно оставить как есть, либо преобразовать к 256 цветам, подобрав подходящую палитру. Но это нетривиальный алгоритм. -------------------- ... |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
квантование или выделение палитры на основе заданной по идее должно производиться автоматически, если отрисовать полученный полноцветный растр на 8битном холсте Добавлено через 5 минут и 21 секунду хотя, нет, все равно придется ее хотя бы сформировать (например равномерно распределить 256 цветов или взять системную палитру), а индексы - конечно должны расставиться в соответствии с ближайшим доступным в этой палитре цветом -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
хотя ... :))
наверное всетаки можно попросить систему сделать такое преобразование: через GetDIBits указать в качестве формата назначения 8битный и поработать с параметрами biClrUsed и biClrImportant, т.е. сказать сначала, что мол нет у меня в палитре цветов, чтобы на выходе получить их автоматически Добавлено через 51 секунду т.е. занулить их -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| nelly |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 17.10.2009 Репутация: нет Всего: нет |
Не, ну я на основе палитры и индексов формировала цвета. Я делала так. B buf лежат те самые индексы на цвета в палитре. Кстати, получены они ракодированием gif картинки (с помощью кода найденного в сети). Картинка отображается верно. Чтоб получить матрицу непосредственно цветов
Фильтр накладывала так:
Ну и потом
После некоторых усовершенствований такой результат...Это 32 бита ![]() Это сообщение отредактировал(а) nelly - 10.5.2011, 14:53 |
||||||||
|
|||||||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
такое очючение, что в buf индексы лежат не с самого начала исходного растра, поэтому здесь сдвиг картинки
вот это-то и не правильно, какой смысл в индекс впихивать RGB? в dst теперь полноцветный отфильтрованный растр, его можно скормить GetDIBits и получить пормальный 8битный, без махинаций но это уже другая проблема, к виду картинки она отношения пока не имеет -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| nelly |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 17.10.2009 Репутация: нет Всего: нет |
Что-то я совсем запуталась. Я думала для 32-битного не индексы нужны, а сами цвета. Это с MSDN для 32:
|
||||||
|
|||||||
| nelly |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 17.10.2009 Репутация: нет Всего: нет |
Спасибо всем огромное за помощь.
Проблема решилась, я просто сделала дурацкую опечатку в коде, где на фильтр умножается. |
|||
|
||||
![]()
|
| Правила форума "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. |