【问题标题】:C++ WIN32: Rescaling Bitmaps/Giving Bitmaps HDC'sC++ WIN32:重新缩放位图/提供位图 HDC
【发布时间】:2015-08-12 04:45:01
【问题描述】:

所以我一直在尝试重新缩放位图而不打印原始图像并重新打印重新缩放的图像。我正在尝试使用基于 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 的任何见解。

【问题讨论】:

  • 仔细查看您一直在使用的DrawBitmap 函数。它已经包含了您需要的一切。您需要做的就是将BitBlt 调用替换为StretchBlt 调用。

标签: c++ winapi bitmap handle stretchblt


【解决方案1】:

您发布的链接 (Scaling an Image) 已经包含渲染位图的代码。您需要做的就是用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;

【讨论】:

  • @jacob:两个 API 调用都将位图从源矩形复制到目标矩形。 StretchBlt 必要时拉伸或压缩位图以适应目标矩形的尺寸。
猜你喜欢
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多