void CChildView::OnPaint()
{
CPaintDC dc(this); // контекст устройства для рисования
if (!raster) return;
CString str = "";
LONG w = 64;
LONG h = 64;
WORD BitsPerPixel = 8;
int step = 64;
int c = 0;
if ( BitsPerPixel == 8 ) {
c = sizeof(RGBQUAD)*256;
}
try {
PBITMAPINFO pbminfo = (PBITMAPINFO)LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER) + c);
if (!pbminfo) {
str = "Не удалось выделить память под PBITMAPINFO";
dc.TextOutA(0, 0, str);
return;
}
memset(&(pbminfo->bmiHeader), 0, sizeof(BITMAPINFOHEADER));
pbminfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbminfo->bmiHeader.biWidth = w;
pbminfo->bmiHeader.biHeight = h;
pbminfo->bmiHeader.biPlanes = 1;
pbminfo->bmiHeader.biBitCount = BitsPerPixel;
pbminfo->bmiHeader.biSizeImage = step*h;
pbminfo->bmiHeader.biCompression = BI_RGB;
if ( BitsPerPixel == 8 ) {
for (int i = 0; i < 256; i++) {
pbminfo->bmiColors.rgbBlue = i;
pbminfo->bmiColors.rgbGreen = i;
pbminfo->bmiColors.rgbRed = i;
pbminfo->bmiColors.rgbReserved = 0;
}
}
SetDIBitsToDevice(dc.GetSafeHdc(), 0, 0, w, h, 0, 0, 0, h, raster, pbminfo, DIB_RGB_COLORS);
LocalFree(pbminfo);
}
catch (CException* e) {
e->ReportError();
}
}
Отрисовка на CView из массива.
Проблема не значительная, но погуглив с часок не нашел требуемого ответа.
Задача - отрисовать на CView массив байт. То есть, имеется массив UCHAR*, для которого известны Width, Height, Step(шаг строки), Depth - это и есть массив пикселей.
Для полноты картины - пишется система видеоконтроля, необходимо часть видео(на самом деле - набор картинок) отображать в окне.
Есть конечно вариант использовать до смешного простой интерфейс OpenCV, но политика партии запрещает.
Скорость - доминантный параметр.
видимо надо сформировать из массива пикселей DIB/DDB и его нарисовать стандартными функциями
[HTML]void CChildView::OnPaint()
{
CPaintDC dc(this); // контекст устройства для рисования
CDC memdc;
CBitmap *oldbmp, newbmp;
if ( !memdc.CreateCompatibleDC(&dc) ) {
//поставить обработку!!!
return;
}
try {
//CreateDIBSection(memdc, *bminfo, SRCCOPY, raster, ???
newbmp.CreateBitmap(16, 16, 1, 32, raster);
oldbmp = (CBitmap*)memdc.SelectObject(&newbmp);
dc.StretchBlt(0, 0, dc.m_ps.rcPaint.right, dc.m_ps.rcPaint.bottom, &memdc, 0, 0, 16, 16, SRCCOPY);
memdc.SelectObject(oldbmp);
}
catch (CException* e) {
e->ReportError();
}
}[/HTML]
Переменная raster = new UCHAR[4096]; - рандомно заполненный массив для теста.
Так вот в таком виде я могу только отображать 32-х битные рисунки. Мне же по хорошему нужно отображать рисунки любой глубины.