0

ビットマップ イメージが読み込まれた 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();
}
}

他に使える方法があれば教えてください。前もって感謝します

4

1 に答える 1

0

いくつかの疑似コード。行と列を持つ 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];
}
于 2013-09-26T07:05:35.360 に答える