Здравствуйте, Xo, Вы писали:
Xo>Добрый день!
Xo>Задача следующая: на 8-битном битмапе рисовать различные геометрические фигуры Xo>с заданным цветом (оттенком) заливки. Реализую это следующим образом:
Попробуй здесь вместо AdibDC передать hdc, полученный от GetDC(hAnyWnd)
hdc
[in] Handle to a device context. If the value of iUsage is DIB_PAL_COLORS, the function uses this device context's logical palette to initialize the DIB colors.
Сдается мне, что у твоего AdibDC с этой самой logical palette не все хорошо, так как в нем пока что выбрана монохромная битовая карта.
Xo>Заливка всегда получается черной. Xo>В чем может быть проблема?
With best regards
Pavel Dvorkin
With best regards
Pavel Dvorkin
Re[2]: Произвольный цвет заливки для 8-битной DIB-секции
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Попробуй здесь вместо AdibDC передать hdc, полученный от GetDC(hAnyWnd)
Спасибо. Это помогает, если стоит задача отрисовки непосредственно в контексте устройства
(при этом на самом битмапе фигура не отображается).
А если рассматривать такой вариант: работа с изображением организована как работа
с некоторой областью памяти. На нем надо рисовать (заданным цветом) различные
геометрические фигуры. Можно ли каким-то образом использовать для этого стандартные
ф-ции типа FillRect, Ellipse и т.п.?
Re[3]: Произвольный цвет заливки для 8-битной DIB-секции
PD>>Попробуй здесь вместо AdibDC передать hdc, полученный от GetDC(hAnyWnd)
Xo>Спасибо. Это помогает, если стоит задача отрисовки непосредственно в контексте устройства Xo>(при этом на самом битмапе фигура не отображается). Xo>А если рассматривать такой вариант: работа с изображением организована как работа Xo>с некоторой областью памяти. На нем надо рисовать (заданным цветом) различные Xo>геометрические фигуры. Можно ли каким-то образом использовать для этого стандартные Xo>ф-ции типа FillRect, Ellipse и т.п.?
Можно. Все стандартно на MemoryDC. А то, что делаете вы — неверно. Не надо выделять массив malloc'ом, надо просто использовать указатель на поверхность, возвращаемый функцией CreateDIBSection.
Здравствуйте, Andrew S, Вы писали:
AS>Не надо выделять массив malloc'ом, надо просто использовать указатель на поверхность, возвращаемый функцией CreateDIBSection.
malloc'ом я выделяю память только под структуру BITMAPINFO+палитра.
А при работе с изображением использую указатель AdibBits:
AS>>Не надо выделять массив malloc'ом, надо просто использовать указатель на поверхность, возвращаемый функцией CreateDIBSection.
Xo>malloc'ом я выделяю память только под структуру BITMAPINFO+палитра. Xo>А при работе с изображением использую указатель AdibBits:
У вас размер выделяемой памяти фиксирован ( sizeof( BITMAPINFO ) + sizeof( RGBQUAD ) * 0xff). Зачем тут malloc?
Xo>Выбор растра, кисти и отрисовка: Xo>
Хотя бы в том, что надо сохранять старые объекты, возвращаемые SelectObject, и потом обратно назначать их. Но не суть важно — приведеный код должен отрисовывать эллипс на битмапе. Он это делает или таки нет? Если нет — смотрите возвращаемые значения и GetLastError.
Здравствуйте, Xo, Вы писали:
Xo>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Попробуй здесь вместо AdibDC передать hdc, полученный от GetDC(hAnyWnd)
Xo>Спасибо. Это помогает, если стоит задача отрисовки непосредственно в контексте устройства
В контексте устройства ничего не рисуется. Рисуется на выбранной в контексте битовой карте, которая и выбрана у тебя.
Xo>(при этом на самом битмапе фигура не отображается).
Отображается. Должна по крайней мере, если она к моменту Ellipse выбрана в контексте.
Xo>А если рассматривать такой вариант: работа с изображением организована как работа Xo>с некоторой областью памяти. На нем надо рисовать (заданным цветом) различные Xo>геометрические фигуры. Можно ли каким-то образом использовать для этого стандартные Xo>ф-ции типа FillRect, Ellipse и т.п.?
Именно так оно и есть. CreateDIBSection возвращает HBITMAP, если ее выбрать в HDC, то рисование пойдет в этой карте (ее можно потом отсоединить от DC и сохранить, к примеру, в файл .bmp). С другой стороны, CreateDIBSection возвращает указатель на байты карты, по нему можно править карту напрямую, независимо от HBITMAP и HDC, да и вообще ни от чего. И то и другое в конечном счете изменяет байты карты.
With best regards
Pavel Dvorkin
With best regards
Pavel Dvorkin
Re[6]: Произвольный цвет заливки для 8-битной DIB-секции
Здравствуйте, Andrew S, Вы писали:
AS>У вас размер выделяемой памяти фиксирован ( sizeof( BITMAPINFO ) + sizeof( RGBQUAD ) * 0xff). Зачем тут malloc?
Согласен
AS>Хотя бы в том, что надо сохранять старые объекты, возвращаемые SelectObject, и потом обратно назначать их.
Часть кода для сохранения/восстановления дескрипторов исходных объектов я временно опустил.
AS>приведеный код должен отрисовывать эллипс на битмапе. Он это делает или таки нет? Если нет — смотрите возвращаемые значения и GetLastError.
Отрисовывает. Только всегда черным цветом, вне зависимости от выбранной кисти и пера Результат вызова ф-ции при этом true, т.е. сама отрисовка проходит успешно. Мне же надо заполнять рисуемую фигуру заданным цветом из палитры (градации серого).
Re[4]: Произвольный цвет заливки для 8-битной DIB-секции
Здравствуйте, Pavel Dvorkin, Вы писали:
Xo>>А если рассматривать такой вариант: работа с изображением организована как работа Xo>>с некоторой областью памяти. На нем надо рисовать (заданным цветом) различные Xo>>геометрические фигуры. Можно ли каким-то образом использовать для этого стандартные Xo>>ф-ции типа FillRect, Ellipse и т.п.?
PD>Именно так оно и есть. CreateDIBSection возвращает HBITMAP, если ее выбрать в HDC, то рисование пойдет в этой карте.
Рисование происходит. Вот только каким образом можно изменить цвет заливки с черного на какой-либо другой из палитры,
заданной при создании DIB-секции?
Re[7]: Произвольный цвет заливки для 8-битной DIB-секции
Xo>Отрисовывает. Только всегда черным цветом, вне зависимости от выбранной кисти и пера Результат вызова ф-ции при этом true, т.е. сама отрисовка проходит успешно. Мне же надо заполнять рисуемую фигуру заданным цветом из палитры (градации серого).
Установите при создании диб секции DIB_RGB_COLORS вместо DIB_PAL_COLORS.
Здравствуйте, Andrew S, Вы писали:
AS>Установите при создании диб секции DIB_RGB_COLORS вместо DIB_PAL_COLORS.
Большое спасибо, Andrew S! Заработало
Правильно ли я понял, что: 1) DIB_PAL_COLORS указывается при необходимости использования выбранной в DC палитры и при этом значения bmiColors — 16битные индексы из этой самой палитры?
2) когда в bmiColors задается своя палитра RGB или изображение имеет глубину цвета > 8 бит, DIB-секция должна быть создана с DIB_RGB_COLORS?
Re[9]: Произвольный цвет заливки для 8-битной DIB-секции
Xo>Правильно ли я понял, что: Xo> Xo>1) DIB_PAL_COLORS указывается при необходимости использования выбранной в DC палитры и при этом значения bmiColors — 16битные индексы из этой самой палитры?
Да.
Xo>2) когда в bmiColors задается своя палитра RGB или изображение имеет глубину цвета > 8 бит, DIB-секция должна быть создана с DIB_RGB_COLORS?
Нет. В этом случае bmiColors может либо не использоваться (т.е. число ентри = 0), либо содержит указанное количество элементов и используется для оптимизации перевода в девайсы, поддерживающие палитру. На практике я не припомню, чтобы кто то эту возможность пользовал.
Xo>