【问题标题】:Crop function BitBlt(...)裁剪函数 BitBlt(...)
【发布时间】:2010-09-08 18:57:09
【问题描述】:

我想在现有引擎中创建裁剪功能。这是我已经拥有的:

bool Bitmap::Crop(RECT cropArea)
{
BITMAP bm;
GetObject(m_Handle, sizeof(bm), &bm);

HDC hSrc = CreateCompatibleDC(NULL);
SelectObject(hSrc, m_Handle);

HDC hNew = CreateCompatibleDC(NULL);
HBITMAP hBmp = CreateCompatibleBitmap(hNew, bm.bmWidth, bm.bmHeight);
HBITMAP hOld = (HBITMAP)SelectObject(hNew, hBmp);

BitBlt(hNew, 0, 0, bm.bmWidth, bm.bmHeight, hSrc, 0, 0, SRCCOPY);

SelectObject(hNew, hOld);

DeleteDC(hSrc);
DeleteDC(hNew);

DeleteObject(m_Handle);

m_Handle = hBmp;
}

我希望它只是将整个图像复制到一个新的 HBITMAP 并用它替换旧的。所以我知道它有效。之后它只是在玩 BitBlt 参数。

m_Handle 是 Bitmap 类的 HBITMAP。

这段代码的结果只是黑屏。

【问题讨论】:

    标签: c++ winapi crop bitblt


    【解决方案1】:

    感谢您帮助我。 该功能现在完美运行。

    bool Bitmap::Crop(RECT cropArea)
    {
    HDC hSrc = CreateCompatibleDC(NULL);
    SelectObject(hSrc, m_Handle);
    
    HDC hNew = CreateCompatibleDC(hSrc);
    HBITMAP hBmp = CreateCompatibleBitmap(hSrc, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top); 
    HBITMAP hOld = (HBITMAP)SelectObject(hNew, hBmp);
    
    bool retVal = (BitBlt(hNew, 0, 0, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top, hSrc, cropArea.left, cropArea.top, SRCCOPY))?true:false;
    
    SelectObject(hNew, hOld);
    
    DeleteDC(hSrc);
    DeleteDC(hNew);
    
    DeleteObject(m_Handle);
    
    m_Handle = hBmp;
    
    return retVal;
    }
    

    【讨论】:

    • 上线bool retVal = (BoolBlt(...))?true:false;,可简写为bool retVal = BoolBlt(...);
    【解决方案2】:

    切勿从“新”内存 DC 创建兼容位图。 除非您想创建 1bpp 位图 - 在新内存 DC 中选择的默认位图是 1x1 1bpp 位图 - 所以您创建的任何兼容位图都将匹配。 这确实会导致全黑输出。

    你的颜色位图在 hSrc 中,所以使用 that dc 来制作新的位图。

    【讨论】:

      【解决方案3】:

      两个小改动:

      HBITMAP hBmp = CreateCompatibleBitmap(hNew, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top); 
      
      BitBlt(hNew, 0, 0, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top, hSrc, cropArea.left, cropArea.top, SRCCOPY); 
      

      您可能需要更多检查以确保请求的区域在原始位图的大小范围内。

      【讨论】:

      • 嗯,不起作用。我认为这与我创建 HDC 的有关。
      • DC 创作在我看来还不错。您应该检查所有内容的返回值,尤其是 SelectObjects。
      • hNew 应该是什么?
      • @Acidic 有问题。
      • 哦,我有一个愚蠢的问题:我可以使用CreateCompatibleBitmap((HDC)hBitmap, ...)吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多