Создание CBitmap
От: SlavaV www.tetron.ru
Дата: 29.06.05 04:28
Оценка:
Здравствуйте,
Подскажите пожалуйста как создать CBitmap если имеется указатель на байтовый массив и структуру BITMAPINFO
Re: Создание CBitmap
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 29.06.05 06:44
Оценка:
Здравствуйте, SlavaV, Вы писали:

SV>Здравствуйте,

SV>Подскажите пожалуйста как создать CBitmap если имеется указатель на байтовый массив и структуру BITMAPINFO

Стори в сторону функции CreateDIBSection
Re: Создание CBitmap
От: MicroCell  
Дата: 29.06.05 07:37
Оценка:
Здравствуйте, SlavaV, Вы писали:

SV>Здравствуйте,

SV>Подскажите пожалуйста как создать CBitmap если имеется указатель на байтовый массив и структуру BITMAPINFO

BITMAPINFO хранит информацию для DIBов. По этому прежде всего тебе придётся создать обычный CBitmap подходящего размера (CreateCompatibleBitmap), создать контекст в пямяти (CreateCompatibleDC), загрузить битмап в контекст и скопировать туда информацию (SetDIBitsToDevice или StretchDIBits). Об этих функциях читай в MSDN
А у Вас нет кого нибудь с гравицаппой и пепелацем?
Re: Создание CBitmap
От: SlavaV www.tetron.ru
Дата: 29.06.05 08:55
Оценка:
Ещё один вопросик
SetDIBitsToDevice не выводит картинку на диалоговое окно
Re[2]: Создание CBitmap
От: bnk СССР http://unmanagedvisio.com/
Дата: 29.06.05 12:14
Оценка:
Здравствуйте, SlavaV, Вы писали:

SV>Ещё один вопросик

SV>SetDIBitsToDevice не выводит картинку на диалоговое окно

Тогда всречный вопрос.. где вы добыли этот массив битов и BITMAPINFO?
Re[2]: Создание CBitmap
От: MicroCell  
Дата: 29.06.05 12:25
Оценка:
Здравствуйте, SlavaV, Вы писали:

SV>Ещё один вопросик

SV>SetDIBitsToDevice не выводит картинку на диалоговое окно

Значит либо палитра не та стоит, либо метод копирования не правильно выбран либо ещё что-то.

Вот функция из библиотеки, которой пользуюсь я сам — CDib, этот класс можно нйти в инете (ну или могу прислать, если мыло укажеш)


BOOL CDib::Draw(CDC* pDC,CRect rcDest,CPoint pntSrc)
/*-----------------------------------------------------------------------------
pDC:    Device context pointer to do output to.
rcDest:    Rectangle on DC to do output to.
pntSrc:    Coordinate of the lower-left corner of the DIB to output into rcDest.
-----------------------------------------------------------------------------*/
{
    /* Check for valid DIB handle */
    if ((m_lpBMIH == NULL) /*|| (m_hPalette == NULL)*/) return FALSE;

    BOOL     bSuccess=FALSE; //Success/fail flag
    HPALETTE hOldPal=NULL; //Previous palette (our DIB's palette is m_hPalette)
    CSize     dibsize = GetDimensions(); //Get DIB's dimensions

    // Select as background since we have already realized in forground if needed
    hOldPal = ::SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE);
    if (pDC->IsPrinting())   // printer DC
    {
        // get size of printer page (in pixels)
        int cxPage = pDC->GetDeviceCaps(HORZRES);
        int cyPage = pDC->GetDeviceCaps(VERTRES);
        // get printer pixels per inch
        int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
        int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);

        // Best Fit case -- create a rectangle which preserves
        // the DIB's aspect ratio, and fills the page horizontally.
        //
        // The formula in the "->bottom" field below calculates the Y
        // position of the printed bitmap, based on the size of the
        // bitmap, the width of the page, and the relative size of
        // a printed pixel (cyInch / cxInch).
        rcDest.top = rcDest.left = 0;
        rcDest.bottom = (int)(((double)dibsize.cy*cxPage*cyInch)
                /((double)dibsize.cx*cxInch));
        rcDest.right = cxPage;
    }
    /* Make sure to use the stretching mode best for color pictures */
    ::SetStretchBltMode(pDC->GetSafeHdc(), COLORONCOLOR);
    /* Determine whether to call StretchDIBits or SetDIBitsToDevice */
    if (dibsize == rcDest.Size()) {
        bSuccess = ::SetDIBitsToDevice(
            pDC->GetSafeHdc(),        //handle of device context
            rcDest.left,            //x-coordinate of upper-left corner of dest. rect.
            rcDest.top,                //y-coordinate of upper-left corner of dest. rect.
            rcDest.Width(),            //source rectangle width
            rcDest.Height(),        //source rectangle height
            pntSrc.x,                //x-coordinate of lower-left corner of source rect.
            pntSrc.y,                //y-coordinate of lower-left corner of source rect.
            0,                        //first scan line in array
            rcDest.Height(),        //number of scan lines
            m_lpImage,                //address of array with DIB bits
            (LPBITMAPINFO)m_lpBMIH,    //address of structure with bitmap info.
            DIB_RGB_COLORS);        //RGB or palette indices
    }
    else {
        bSuccess = ::StretchDIBits(
            pDC->GetSafeHdc(),        //handle of device context
            rcDest.left,            //x-coordinate of upper-left corner of dest. rect.
            rcDest.top,                //y-coordinate of upper-left corner of dest. rect.
            rcDest.Width(),            //width of destination rectangle
            rcDest.Height(),        //height of destination rectangle
            pntSrc.x,                //x-coordinate of upper-left corner of source rect.
            pntSrc.y,                //y-coordinate of upper-left corner of source rect.
            m_lpBMIH->biWidth,        //width of source rectangle
            m_lpBMIH->biHeight,        //height of source rectangle
            m_lpImage,                //address of bitmap bits
            (LPBITMAPINFO)m_lpBMIH,    //address of bitmap data
            DIB_RGB_COLORS,            //usage
            SRCCOPY);                //raster operation code
    }
    /* Reselect old palette */
    if (hOldPal != NULL)
    {
        ::SelectPalette(pDC->GetSafeHdc(), hOldPal, TRUE);
    }
    return bSuccess;
}
А у Вас нет кого нибудь с гравицаппой и пепелацем?
Re: Создание CBitmap
От: SlavaV www.tetron.ru
Дата: 29.06.05 14:23
Оценка:
Здравствуйте, SlavaV, Вы писали:

SV>Здравствуйте,

SV>Подскажите пожалуйста как создать CBitmap если имеется указатель на байтовый массив и структуру BITMAPINFO

Спасибо, что ещё терпите, а не махнули рукой
//OnDraw
HDC hDC;
hDC = pDC->GetSafeHdc();
//------------------------------------------------------------------
//Создаём структуру BITMAPINFO
BITMAPINFO *lpDIBHeader = NULL;
LPLOGPALETTE lpPal = NULL;
HPALETTE hPGrayscale = NULL;
// fill the DIB header
if( (lpDIBHeader = (BITMAPINFO *)malloc( sizeof( BITMAPINFO ) + sizeof( RGBQUAD ) * 255 )) == NULL )
MessageBox("lpDIBHeader no mem", "Ошибка", MB_OK);
lpDIBHeader->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
lpDIBHeader->bmiHeader.biWidth = 256;
lpDIBHeader->bmiHeader.biHeight = 360;
lpDIBHeader->bmiHeader.biPlanes = 1;
lpDIBHeader->bmiHeader.biBitCount = 8;
lpDIBHeader->bmiHeader.biCompression = BI_RGB;
if( (lpPal = (LPLOGPALETTE)malloc( sizeof( LOGPALETTE ) + sizeof( PALETTEENTRY ) * 255 )) == NULL )
MessageBox("lpPal no mem", "Ошибка", MB_OK);
//Заполняем палитру
for( int iCyc = 0; iCyc < 256; iCyc++ )
{
if ( iCyc > 127 )
lpDIBHeader->bmiColors[iCyc].rgbBlue = lpDIBHeader->bmiColors[iCyc].rgbGreen = lpDIBHeader->bmiColors[iCyc].rgbRed = lpPal->palPalEntry[iCyc].peBlue =lpPal->palPalEntry[iCyc].peGreen = lpPal->palPalEntry[iCyc].peRed = (BYTE)255;
else
lpDIBHeader->bmiColors[iCyc].rgbBlue = lpDIBHeader->bmiColors[iCyc].rgbGreen = lpDIBHeader->bmiColors[iCyc].rgbRed = lpPal->palPalEntry[iCyc].peBlue =lpPal->palPalEntry[iCyc].peGreen = lpPal->palPalEntry[iCyc].peRed = (BYTE)0;
}

lpPal->palVersion = 0x300;
lpPal->palNumEntries = 256;
hPGrayscale = ::CreatePalette(lpPal);

char *cptrData;
char *cptrDIBData;
char *lpDIBData;
if( (cptrDIBData = (char *)malloc( sizeof( char ) * 256 * 360 )) == NULL )
MessageBox("cptrDIBData no mem", "Ошибка", MB_OK);
lpDIBData = cptrDIBData;
// rotate an image while copying data to the DIB data
cptrData = (char *)pDoc->m_DataPtr + (360 — 1) * 256;//pDoc->m_DataPtr указатель на массив данных со сканера
//Разворачиваем изображение
for( iCyc = 0; iCyc < 360; iCyc++ )
{
memcpy( cptrDIBData, cptrData, 256 );
cptrData = cptrData — 256;
cptrDIBData = cptrDIBData + 256;
}
::SelectPalette(hDC , hPGrayscale, false);
::RealizePalette(hDC);
::SetDIBitsToDevice(hDC, 40,40, 256, 360, 0, 0, 0, 360, lpDIBData, lpDIBHeader, DIB_RGB_COLORS);
::ReleaseDC(m_hWnd, hDC);

Это код всё нормально работает выводит изображение в основное окно, но не хочет печататься ошибку выдаёт.
и не хочет выводить изображение в диалоговое окно (при подстановке hDC диалога). Поэтому пришла идея преобразовать его в CBitmap и тут опять проблемы.
//Функция обработки события OnPaint в диалоговом окне
//------------------------------------------------------------------
//Создаём структуру BITMAPINFO
BITMAPINFO *lpDIBHeader = NULL;
HBITMAP hBM;
HDC hDC;
CDC DCMem;
if( (lpDIBHeader = (BITMAPINFO *)malloc( sizeof( BITMAPINFO ) + sizeof( RGBQUAD ) * 255 )) == NULL )
MessageBox("lpDIBHeader no mem", "Ошибка", MB_OK);
lpDIBHeader->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
lpDIBHeader->bmiHeader.biWidth = 256;
lpDIBHeader->bmiHeader.biHeight = 360;
lpDIBHeader->bmiHeader.biPlanes = 1;
lpDIBHeader->bmiHeader.biBitCount = 8;
lpDIBHeader->bmiHeader.biCompression = BI_RGB;
//Заполняем палитру
for( int iCyc = 0; iCyc < 256; iCyc++ )
{
lpDIBHeader->bmiColors[iCyc].rgbBlue = lpDIBHeader->bmiColors[iCyc].rgbGreen = lpDIBHeader->bmiColors[iCyc].rgbRed = (BYTE)iCyc;
}
hDC = ::CreateCompatibleDC(pDC->m_hDC);
hBM = ::CreateCompatibleBitmap(hDC, 256, 360);
::SetDIBits(hDC, hBM, 0, 360, m_DataPtr, lpDIBHeader, DIB_RGB_COLORS);//m_DataPtr указатель на массив данных со сканера
m_Bitmap = CBitmap::FromHandle(hBM);
DCMem.CreateCompatibleDC(pDC);
DCMem.SelectObject(m_Bitmap);
pDC->BitBlt(10, 10, 256, 360, &DCMem, 0, 0, SRCCOPY);
Ни в какую не хочет работать
Re: Создание CBitmap
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 30.06.05 07:36
Оценка:
Здравствуйте, SlavaV, Вы писали:

SV>Здравствуйте,

SV>Подскажите пожалуйста как создать CBitmap если имеется указатель на байтовый массив и структуру BITMAPINFO

Сработает если формат не палитрованный


BITMAPINFO bi; // Твоя структура
void* pBits; //Твои биты

void* pBuffer = NULL;
HBITMAP hBm = (HBITMAP)::CreateDIBSection (NULL, &bi, DIB_RGB_COLORS, (void**)&pBuffer, NULL, 0);
CopyMemory (pBuffer, pBits, bi.biWidth * biHeight * (bi.bitCount + 31) / 32);

CBitmap bmp;
bmp.Attach (hBm);


Возможны синтаксические ошибки, т.к пишу по пямяти, но идея такакя.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.