Здравствуйте, SlavaV, Вы писали:
SV>Здравствуйте, SV>Подскажите пожалуйста как создать CBitmap если имеется указатель на байтовый массив и структуру BITMAPINFO
Здравствуйте, SlavaV, Вы писали:
SV>Здравствуйте, SV>Подскажите пожалуйста как создать CBitmap если имеется указатель на байтовый массив и структуру BITMAPINFO
BITMAPINFO хранит информацию для DIBов. По этому прежде всего тебе придётся создать обычный CBitmap подходящего размера (CreateCompatibleBitmap), создать контекст в пямяти (CreateCompatibleDC), загрузить битмап в контекст и скопировать туда информацию (SetDIBitsToDevice или StretchDIBits). Об этих функциях читай в MSDN
А у Вас нет кого нибудь с гравицаппой и пепелацем?
Здравствуйте, 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;
}
А у Вас нет кого нибудь с гравицаппой и пепелацем?
Здравствуйте, SlavaV, Вы писали:
SV>Здравствуйте, SV>Подскажите пожалуйста как создать CBitmap если имеется указатель на байтовый массив и структуру BITMAPINFO
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);
Ни в какую не хочет работать
Здравствуйте, SlavaV, Вы писали:
SV>Здравствуйте, SV>Подскажите пожалуйста как создать CBitmap если имеется указатель на байтовый массив и структуру BITMAPINFO