нарисовать на 8 битном буффере памяти
От: Аноним  
Дата: 14.01.11 12:27
Оценка:
подскажите кто знает как лучше сделать, есть буффер в памяти с черно белым 8 битным изображением, как бы мне его приаттачить к dc чтобы на нем кое что нарисовать, прямо на самом буффере, важно быстродействие, на экран это попадать не будет, потом сжимается и записывается в файл
Re: нарисовать на 8 битном буффере памяти
От: Pavel Dvorkin Россия  
Дата: 14.01.11 13:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>подскажите кто знает как лучше сделать, есть буффер в памяти с черно белым 8 битным изображением, как бы мне его приаттачить к dc чтобы на нем кое что нарисовать, прямо на самом буффере, важно быстродействие, на экран это попадать не будет, потом сжимается и записывается в файл


Черно-белое, но при этом 8-битное — это что ? Монохром или все же gray-scaled ?

Я могу только одно предложить. Как ты этот буфер создаешь ? new или malloc или аналогично, так ? А вот такой способ создать этот буфер тебя не устроит ?

CreateDIBSection
The CreateDIBSection function creates a DIB that applications can write to directly. The function gives you a pointer to the location of the bitmap bit values. You can supply a handle to a file-mapping object that the function will use to create the bitmap, or you can let the system allocate the memory for the bitmap.

HBITMAP CreateDIBSection(
HDC hdc, // handle to DC
CONST BITMAPINFO *pbmi, // bitmap data
UINT iUsage, // data type indicator
VOID **ppvBits, // bit values
HANDLE hSection, // handle to file mapping object
DWORD dwOffset // offset to bitmap bit values
);

Заполняешь BITMAPINFO, ставишь iUsage в DIB_PAL_COLORS, hSection = 0, dwOffset = 0

и функция сама выделяет тебе память под буфер , требуемого размера, по байту на пиксель, и возвращает тебе указатель на этот буфер через ppvBits. Иными словами, она работает как new/malloc. Но при этом она вернет тебе HBITMAP, который можно использовать стандартным путем, то есть SelectObject ее и т.д.
With best regards
Pavel Dvorkin
Re[2]: нарисовать на 8 битном буффере памяти
От: Аноним  
Дата: 14.01.11 13:54
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

изображение имеется ввиду gray-scaled 256 цветное, к сожалению буфер выделяется совсем в другом месте и заменить выделение не представляется возможным, может есть другой способ как приаттачить уже имеющийся буффер?
что я сейчас нашел то можно использовать файл маппинг и передать его в эту функцию, но опять засада при MapViewOfFileEx буффер должен делиться на гранулярность, что опять же может не выполняться по причине выделения памяти в другом месте....
Re[3]: нарисовать на 8 битном буффере памяти
От: CEMb  
Дата: 14.01.11 14:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>изображение имеется ввиду gray-scaled 256 цветное, к сожалению буфер выделяется совсем в другом месте и заменить выделение не представляется возможным, может есть другой способ как приаттачить уже имеющийся буффер?


SetDIBitsToDevice(hdc, xDst, yDst, w, h, xSrc, ySrc, iStartLine, iEndLine, lpByteData, (BITMAPINFO *)&bi, DIB_RGB_COLORS);

не забыть ещё: изображение "заливается" вверх ногами
Re[3]: нарисовать на 8 битном буффере памяти
От: Pavel Dvorkin Россия  
Дата: 14.01.11 14:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Pavel Dvorkin, Вы писали:


А>изображение имеется ввиду gray-scaled 256 цветное, к сожалению буфер выделяется совсем в другом месте и заменить выделение не представляется возможным


Извини за назойливость, а все же почему ? Ну пусть в другом месте, там что, нельзя одну строчку заменить?

>может есть другой способ как приаттачить уже имеющийся буффер?


Ну вообще-то есть такое решение.

CreateDIBitmap на основе этих байтов. Естественно, создается DDB и данные копируются
Рисуем
GetDIBits обратно в твой буфер.

Не скажу, что мне это нравится, двойной расход памяти (правда, скорее всего видео), но все же это какое-то решение.



А>что я сейчас нашел то можно использовать файл маппинг и передать его в эту функцию, но опять засада при MapViewOfFileEx буффер должен делиться на гранулярность, что опять же может не выполняться по причине выделения памяти в другом месте....


Увы, при вызове этой функции с мэппингом ей передается не окно от MapViewOfFileEx, а хендл мэппинга и смещение в нем.
With best regards
Pavel Dvorkin
Re[4]: нарисовать на 8 битном буффере памяти
От: Аноним  
Дата: 14.01.11 14:12
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Здравствуйте, Аноним, Вы писали:


А>>изображение имеется ввиду gray-scaled 256 цветное, к сожалению буфер выделяется совсем в другом месте и заменить выделение не представляется возможным, может есть другой способ как приаттачить уже имеющийся буффер?


CEM>SetDIBitsToDevice(hdc, xDst, yDst, w, h, xSrc, ySrc, iStartLine, iEndLine, lpByteData, (BITMAPINFO *)&bi, DIB_RGB_COLORS);


CEM>не забыть ещё: изображение "заливается" вверх ногами


а как должен быть создан DC? CreateCompatibleDC(NULL); ?
Re[4]: нарисовать на 8 битном буффере памяти
От: Pavel Dvorkin Россия  
Дата: 14.01.11 14:16
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Здравствуйте, Аноним, Вы писали:


А>>изображение имеется ввиду gray-scaled 256 цветное, к сожалению буфер выделяется совсем в другом месте и заменить выделение не представляется возможным, может есть другой способ как приаттачить уже имеющийся буффер?


CEM>SetDIBitsToDevice(hdc, xDst, yDst, w, h, xSrc, ySrc, iStartLine, iEndLine, lpByteData, (BITMAPINFO *)&bi, DIB_RGB_COLORS);


CEM>не забыть ещё: изображение "заливается" вверх ногами


biHeight
Specifies the height of the bitmap, in pixels. If biHeight is positive, the bitmap is a bottom-up DIB and its origin is the lower-left corner. If biHeight is negative, the bitmap is a top-down DIB and its origin is the upper-left corner.
If biHeight is negative, indicating a top-down DIB, biCompression must be either BI_RGB or BI_BITFIELDS. Top-down DIBs cannot be compressed.
With best regards
Pavel Dvorkin
Re[4]: нарисовать на 8 битном буффере памяти
От: Pavel Dvorkin Россия  
Дата: 14.01.11 14:19
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>SetDIBitsToDevice(hdc, xDst, yDst, w, h, xSrc, ySrc, iStartLine, iEndLine, lpByteData, (BITMAPINFO *)&bi, DIB_RGB_COLORS);


Что-то я сомневаюсь.

The SetDIBitsToDevice function sets the pixels in the specified rectangle on the device that is associated with the destination device context using color data from a DIB.

Пиксели поставить в значения , используя данные из буфера можно, но с какой стати рисование на этом контексте потом изменит этот буфер ?
With best regards
Pavel Dvorkin
Re[5]: нарисовать на 8 битном буффере памяти
От: CEMb  
Дата: 14.01.11 18:32
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

CEM>>SetDIBitsToDevice(hdc, xDst, yDst, w, h, xSrc, ySrc, iStartLine, iEndLine, lpByteData, (BITMAPINFO *)&bi, DIB_RGB_COLORS);


PD>Что-то я сомневаюсь.


PD>The SetDIBitsToDevice function sets the pixels in the specified rectangle on the device that is associated with the destination device context using color data from a DIB.


PD>Пиксели поставить в значения , используя данные из буфера можно, но с какой стати рисование на этом контексте потом изменит этот буфер ?


буфер не изменит, его надо будет заново снимать. Но человек просил способ залить данные в контекст

PD>biHeight

Specifies the height of the bitmap, in pixels. If biHeight is positive, the bitmap is a bottom-up DIB and its origin is the lower-left corner. If biHeight is negative, the bitmap is a top-down DIB and its origin is the upper-left corner.
If biHeight is negative, indicating a top-down DIB, biCompression must be either BI_RGB or BI_BITFIELDS. Top-down DIBs cannot be compressed.

Блин, а я ведь видел отрицательную высоту в числе строк в примерах, и не обратил внимание

A> а как должен быть создан DC? CreateCompatibleDC(NULL); ?


Ну, вообще, он должен быть Compatible с тем, в который рисовать собираешься.
Я, вообще совместимость делаю через CreateCompatibleDC(hdc) — в который рисую, а битовую карту заливаю, устанавливая её настоящую битность. Функции SetDIBits и SetDIBitsToDevice сами всё "делают" при этом правильно, биты конвретируются в формат текущего битмапа.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.