Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 10.01.2012, 18:30   #1
Glaciuse
Пользователь
 
Регистрация: 22.05.2011
Сообщений: 44
По умолчанию Ф-я Get24BitPixels

Есть функция:

Код:
BYTE* Get24BitPixels(HBITMAP pBitmap, WORD *pwWidth, WORD *pwHeight)
{
  // a bitmap object just to get bitmap width and height
    BITMAP bmpBmp;
 
  // pointer to original bitmap info
    LPBITMAPINFO pbmiInfo;
 
  // bitmap info will hold the new 24bit bitmap info
  BITMAPINFO bmiInfo;
 
  // width and height of the bitmap
  WORD wBmpWidth, wBmpHeight;
 
  // ---------------------------------------------------------
  // get some info from the bitmap
  // ---------------------------------------------------------
    GetObject(pBitmap, sizeof(bmpBmp),&bmpBmp);
  pbmiInfo   = (LPBITMAPINFO)&bmpBmp;
 
  // get width and height
    wBmpWidth  = (WORD)pbmiInfo->bmiHeader.biWidth;
    wBmpWidth -= (wBmpWidth%4);                       // width is 4 byte boundary aligned.
    wBmpHeight = (WORD)pbmiInfo->bmiHeader.biHeight;
 
  // copy to caller width and height parms
  *pwWidth  = wBmpWidth;
  *pwHeight = wBmpHeight;
  // ---------------------------------------------------------
 
    // allocate width * height * 24bits pixels
  BYTE *pPixels = new BYTE[wBmpWidth*wBmpHeight*3];
    if (!pPixels) return NULL;
 
  // get user desktop device context to get pixels from
    HDC hDC = GetWindowDC(NULL);
 
  // fill desired structure
    bmiInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmiInfo.bmiHeader.biWidth = wBmpWidth;
    bmiInfo.bmiHeader.biHeight = -wBmpHeight;
    bmiInfo.bmiHeader.biPlanes = 1;
    bmiInfo.bmiHeader.biBitCount = 24;
    bmiInfo.bmiHeader.biCompression = BI_RGB;
    bmiInfo.bmiHeader.biSizeImage = wBmpWidth*wBmpHeight*3;
    bmiInfo.bmiHeader.biXPelsPerMeter = 0;
    bmiInfo.bmiHeader.biYPelsPerMeter = 0;
    bmiInfo.bmiHeader.biClrUsed = 0;
    bmiInfo.bmiHeader.biClrImportant = 0;
 
  // get pixels from the original bitmap converted to 24bits
  int iRes = GetDIBits(hDC,pBitmap,0,wBmpHeight,(LPVOID)pPixels,&bmiInfo,DIB_RGB_COLORS);
 
  // release the device context
    ReleaseDC(NULL,hDC);
 
  // if failed, cancel the operation.
    if (!iRes)
  {
    delete pPixels;
    return NULL;
  };
 
  // return the pixel array
    return pPixels;
}
Как изменить фун-ию, чтобы она была расчитана на работу с 2х битным bitmap?

Последний раз редактировалось MaTBeu; 11.01.2012 в 14:28.
Glaciuse вне форума
Старый 11.01.2012, 14:32   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Код:
BYTE *pPixels = new BYTE[wBmpWidth*wBmpHeight*3];
заменить на
Код:
BYTE *pPixels = new BYTE[wBmpWidth*wBmpHeight/8];
и

Код:
bmiInfo.bmiHeader.biBitCount = 24;
заменить на
Код:
bmiInfo.bmiHeader.biBitCount = 1;
И вообще почитайте доку по формату BMP.
MaTBeu вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц