Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отрисовка на CView из массива.

70K
25 мая 2011 года
DISconnect
6 / / 25.05.2011
Добрый день всем.
Проблема не значительная, но погуглив с часок не нашел требуемого ответа.
Задача - отрисовать на CView массив байт. То есть, имеется массив UCHAR*, для которого известны Width, Height, Step(шаг строки), Depth - это и есть массив пикселей.
Для полноты картины - пишется система видеоконтроля, необходимо часть видео(на самом деле - набор картинок) отображать в окне.
Есть конечно вариант использовать до смешного простой интерфейс OpenCV, но политика партии запрещает.
Скорость - доминантный параметр.
14
25 мая 2011 года
Phodopus
3.3K / / 19.06.2008
видимо надо сформировать из массива пикселей DIB/DDB и его нарисовать стандартными функциями
70K
26 мая 2011 года
DISconnect
6 / / 25.05.2011
Я уже реализовал, но криво, т.к. могу отображать ТОЛЬКО совместимую с "девайсом" палитру. Из примера станет ясно о чем я говорю.

[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-х битные рисунки. Мне же по хорошему нужно отображать рисунки любой глубины.
70K
26 мая 2011 года
DISconnect
6 / / 25.05.2011
Тему можно закрыть, разобрался сам.
Для тех, кто любит понимать суть вещей, а не копипастить нужно зайти сюда и сюда. Популярно и доступно.

Собственно само решение, доступное для любого случая:

Код:
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();
    }
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог