подскажите кто знает как лучше сделать, есть буффер в памяти с черно белым 8 битным изображением, как бы мне его приаттачить к dc чтобы на нем кое что нарисовать, прямо на самом буффере, важно быстродействие, на экран это попадать не будет, потом сжимается и записывается в файл
Здравствуйте, Аноним, Вы писали:
А>подскажите кто знает как лучше сделать, есть буффер в памяти с черно белым 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
);
и функция сама выделяет тебе память под буфер , требуемого размера, по байту на пиксель, и возвращает тебе указатель на этот буфер через ppvBits. Иными словами, она работает как new/malloc. Но при этом она вернет тебе HBITMAP, который можно использовать стандартным путем, то есть SelectObject ее и т.д.
With best regards
Pavel Dvorkin
Re[2]: нарисовать на 8 битном буффере памяти
От:
Аноним
Дата:
14.01.11 13:54
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:
изображение имеется ввиду gray-scaled 256 цветное, к сожалению буфер выделяется совсем в другом месте и заменить выделение не представляется возможным, может есть другой способ как приаттачить уже имеющийся буффер?
что я сейчас нашел то можно использовать файл маппинг и передать его в эту функцию, но опять засада при MapViewOfFileEx буффер должен делиться на гранулярность, что опять же может не выполняться по причине выделения памяти в другом месте....
Здравствуйте, Аноним, Вы писали:
А>изображение имеется ввиду gray-scaled 256 цветное, к сожалению буфер выделяется совсем в другом месте и заменить выделение не представляется возможным, может есть другой способ как приаттачить уже имеющийся буффер?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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); ?
Здравствуйте, 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.
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.
Пиксели поставить в значения , используя данные из буфера можно, но с какой стати рисование на этом контексте потом изменит этот буфер ?
Здравствуйте, 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 сами всё "делают" при этом правильно, биты конвретируются в формат текущего битмапа.