-1

所以我一直在尝试重新缩放位图而不打印原始图像并重新打印重新缩放的图像。我正在尝试使用基于 MSDN Microsoft 重新缩放图像功能的 StretchBlt():

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

但这需要一个连接到源的辅助 hdc,如果不先打印 HBITMAP,就无法进行拉伸。有没有办法将 HBITMAP 转换为 HDC?我已经能够从 HBITMAP 中获取 HANDLE,这可能会提供更直接的路线。我可以做的另一件事是在标准位图中分配的内存(未保存)中创建一个调整大小的位图并打印它。

我打印位图的标准方式是:

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);

我可以尝试的另一个选择是研究另一种显示 bmp 的方法。我对win32很陌生,所以我不知道完成这项任务的任何其他方法。关于如何在不首先打印它的情况下重新缩放 BITMAP 的任何见解。

4

1 回答 1

3

您发布的链接(缩放图像)已经包含呈现位图的代码。您需要做的就是用StretchBlt替换对BitBlt的调用:

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;
于 2015-08-11T10:48:14.093 回答