2015-08-11 3 views
-1

Итак, я пытаюсь перемасштабировать растровое изображение без печати оригинала и перепечатки изображения с измененной картинкой. Я пытаюсь использовать StretchBlt(), на основе функции Microsoft MSDN перемасштабирования изображения:C++ WIN32: масштабирование растровых изображений/предоставление растровых изображений HDC's

https://msdn.microsoft.com/en-us/library/windows/desktop/dd162950(v=vs.85).aspx

но требует вторичного HDC привязанного к источнику, который растягивания не может быть сделана без печати HBITMAP первый. Есть ли способ конвертировать HBITMAP в HDC? Я смог получить HANDLE из HBITMAP, что может обеспечить более прямой маршрут. Другая вещь, которую я мог бы сделать, - создать измененную растровую карту в выделенной памяти (не сохраненной) из стандартного растрового изображения и напечатать это.

Стандартный способ я печать растровых изображений:

HBITMAP hBitmap; 
static HANDLE hDIB = NULL; 
CHAR szFileName[MAX_PATH] = "fileName.bmp"; 

hDIB = OpenDIB((LPSTR)szFileName); 

hBitmap = BitmapFromDIB(hDIB, NULL); 

DrawBitmap(hdc, x, y, hBitmap, SRCCOPY); 

Другого варианта я мог бы попробовать это посмотреть в другое средство отображения ВМРА. Я довольно новичок в win32, поэтому я не знаю никаких других способов решения этой задачи. Любое понимание того, как я могу перемасштабировать BITMAP, не печатая его в первую очередь.

+2

Осмотрите ближе 'функции DrawBitmap' вас» я использовал. В нем уже есть все, что вам нужно. Все, что вам нужно сделать, это заменить вызов 'BitBlt' вызовом' StretchBlt'. – glank

+0

http://pastebin.com/rNHrDmzg – Brandon

ответ

2

Ссылка, которую вы опубликовали (Scaling an Image), уже содержит код, который отображает растровое изображение. Все, что вам нужно сделать, это заменить вызов BitBlt с StretchBlt:

BOOL DrawBitmap (HDC hDC, INT x, INT y, INT width, INT height, HBITMAP hBitmap, DWORD dwROP) 
{ 
    HDC  hDCBits; 
    BITMAP Bitmap; 
    BOOL  bResult; 

    if (!hDC || !hBitmap) 
     return FALSE; 

    hDCBits = CreateCompatibleDC(hDC); 
    GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap); 
    SelectObject(hDCBits, hBitmap); 
    // Replace with StretchBlt call 
    //bResult = BitBlt(hDC, x, y, Bitmap.bmWidth, Bitmap.bmHeight, hDCBits, 0, 0, dwROP); 
    bResult = StretchBlt(hDC, x, y, width, height, 
         hDCBits, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, dwROP); 
    DeleteDC(hDCBits); 

    return bResult; 
} 

Вы можете назвать это из обработчика сообщений WM_PAINT, например:

case WM_PAINT: 
{ 
    PAINTSTRUCT ps = { 0 }; 
    HDC hDC = ::BeginPaint(hWnd, &ps); 
    RECT rc = { 0 }; 
    ::GetClientRect(hWnd, &rc); 
    DrawBitmap(hDC, 0, 0, rc.right, rc.bottom, hBitmap, SRCCOPY); 
    ::EndPaint(hWnd, &ps); 
} 
break; 
+0

@jacob: Оба вызова API копируют растровое изображение из исходного прямоугольника в целевой прямоугольник. 'StretchBlt' растягивает или сжимает растровое изображение, чтобы при необходимости соответствовать размерам прямоугольника назначения. – IInspectable