【问题标题】:Rotate Bitmap 90deg , 270deg in MFC在 MFC 中旋转位图 90 度、270 度
【发布时间】:2013-09-26 15:05:35
【问题描述】:

我有一个 SDI mfc 应用程序,其中加载了位图图像,我想将该位图旋转 90 度、180 度和 270 度。 我能够将它旋转 180 度。但我卡在 90 和 270 度。 这是代码。

void CBmpView::OnRotate180() 
{
BYTE ptempBit ;
CBmpViewerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

int nLenght = (pDoc->dwBitsSize);
if(pBitsView != NULL){
    DeleteObject(pBitsView);    
}
if(pDoc->m_bRotationFlag == FALSE){
pDoc->m_bmpHandle = CreateDIBSection(NULL, pDoc->m_bitmapinfo,DIB_RGB_COLORS,
    (void **)&pBitsView, NULL, 0);
CopyMemory(pBitsView,pDoc->m_pBits,pDoc->dwBitsSize);

for(int i=0; i < ((nLenght-1)) ; i++ ){
    ptempBit = pBitsView[i];
    pBitsView[i] = pBitsView[nLenght - 1];
    pBitsView[nLenght - 1] = ptempBit;
    nLenght --;
}
pDoc->m_bRotationFlag = TRUE;
Invalidate();
}else if(pDoc->m_bRotationFlag == TRUE){
    pDoc->m_bmpHandle = CreateDIBSection(NULL, pDoc->m_bitmapinfo,DIB_RGB_COLORS,
        (void **)&pBitsView, NULL, 0);
    CopyMemory(pBitsView,pDoc->m_pBits,pDoc->dwBitsSize);
    pDoc->m_bRotationFlag = FALSE;
    Invalidate();
}
}

请告诉我是否可以使用任何其他方法。 提前致谢

【问题讨论】:

    标签: mfc bitmap


    【解决方案1】:

    只是一些伪代码。 让我们假设一个带有 iMaxRows 和 iMaxCols 的网格带有行和列。 应该是:

    // Sourcegrid is always 
    Pixels oldGrid[iMaxRows][iMaxCols]
    

    +

    // 90°
    Pixels newGrid[iMaxCols][iMaxRows];
    for (int iRow=0; iRow<iMaxRows; ++iRow)
    {
      for (int iCol=0; iCol<iMaxCols; ++iCol)
        newGrid[iCol][iMaxRow-iRow-1] = oldGrid[iRow][iCol];
    }
    

    +

    // 180°
    Pixels newGrid[iMaxRows][iMaxCols];
    for (int iRow=0; iRow<iMaxRows; ++iRow)
    {
      for (int iCol=0; iCol<iMaxCols; ++iCol)
         newGrid[iMaxRow-iRow-1][iMaxCols-iCol-1] = oldGrid[iRow][iCol];
    }
    

    +

    // 270°
    Pixels newGrid[iMaxCols][iMaxRows];
    for (int iRow=0; iRow<iMaxRows; ++iRow)
    {
      for (int iCol=0; iCol<iMaxCols; ++iCol)
         newGrid[iMaxCols-iCol-1][iRow] = oldGrid[iRow][iCol];
    }
    

    【讨论】:

    • 正如您在代码中看到的,像素数据是一维数组。所以我无法实现你提出的代码。您能提出其他解决方案吗?
    • 问题出在哪里? grif[iRow][iCol] 转换为 gridOnArray[iRow*iMaxCols+Icol]!这是简单的数学。
    • 感谢 xMRi 但是,对于 grif[iRow][iCol] 转换为 gridOnArray[iRow*iMaxCols+icol] 没问题,但是对于 newGrid[iCol][iMaxRow-iRow-1]newGrid[iMaxRow-iRow-1][iMaxCols-iCol-1] newGrid[iMaxCols-iCol-1][iRow] 它会转换成什么?
    • 使用你想要的值访问并替换我的小表达式中的 valies iRow 和 iCol。