在MFC中旋转位图90度、270度

在MFC中旋转位图90度、270度,mfc,bitmap,Mfc,Bitmap,我有一个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){ D

我有一个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();
}
}
void CBmpView::OnRotate180()
{
字节位;
CBmpViewerDoc*pDoc=GetDocument();
断言有效(pDoc);
int nLenght=(pDoc->DWBITSIZE);
if(pBitsView!=NULL){
DeleteObject(pBitsView);
}
如果(pDoc->m_bRotationFlag==FALSE){
pDoc->m_bmpHandle=CreateDIBSection(NULL,pDoc->m_bitmapinfo,DIB_RGB_颜色,
(void**)和pBitsView,NULL,0);
CopyMemory(pBitsView,pDoc->m_pBits,pDoc->dwBitsSize);
对于(int i=0;i<((nLenght-1));i++){
ptempBit=pBitsView[i];
pBitsView[i]=pBitsView[nLenght-1];
pBitsView[nLenght-1]=ptempBit;
长度--;
}
pDoc->m_bRotationFlag=TRUE;
使无效();
}否则如果(pDoc->m_bRotationFlag==TRUE){
pDoc->m_bmpHandle=CreateDIBSection(NULL,pDoc->m_bitmapinfo,DIB_RGB_颜色,
(void**)和pBitsView,NULL,0);
CopyMemory(pBitsView,pDoc->m_pBits,pDoc->dwBitsSize);
pDoc->m_bRotationFlag=FALSE;
使无效();
}
}
请告诉我是否可以使用其他方法。 提前感谢

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

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

/90°
像素新网格[iMaxCols][iMaxRows];

对于(int iRow=0;iRowAs,您可以在代码中看到像素数据是一维数组。因此我无法实现您提出的代码。您能提出其他解决方案吗?问题在哪里?grif[iRow][iCol]转换为gridOnArray[iRow*iMaxCols+iCol]!这是简单的数学。谢谢xMRi,但是,对于grif[iRow][iCol]翻译成gridOnArray[iRow*iMaxCols+icol]没问题,但是新网格[icol][iMaxRow-iRow-1]
新网格[iMaxRow-iRow-1][iMaxCols-icol-1]
新网格[iMaxCols-icol-1][iRow]它将转换成什么?使用您想要访问的值并在我的小表达式中替换有效的iRow和icol 1。
// 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];
}