2

圧縮されていない 24 ビットの .bmp ファイル

90 の倍数の回転を指定して .bmp ファイルを回転する必要があります。たとえば、画像があり、+90 または -90 の回転係数が指定されています。私の画像は、回転係数に従って左または右に 90 度回転します。ファイルのサイズが等しい場合、つまり高さと幅が等しい場合、私のプログラムは正常に動作しますが、正方形ではない画像で実行すると、セグメント エラーが発生します。

これは私がこれまでに持っているコードです。

if(rotation == 90 || rotation == -270 )
{
    /* 90 = -270 */
    for(row = 0; row < rows; row++)
    {
        for(col = 0; col < cols; col++ )
        {
            PIXEL* o = original+ (row*cols) + col;
            PIXEL* n = (*new)+((cols-col-1)*cols) + row;
            *n = *o;
        }
    }
    *newcols = cols;
    *newrows = rows;

このメソッドのヘッダーは次のとおりです。

int rotate(PIXEL* original, int rows, int cols, int rotation,
   PIXEL** new, int* newrows, int* newcols)

ここで、PIXEL* original には元の .bmp ファイルが含まれます

行と列は、.bmp ファイルを読み取るメソッドの呼び出しによって取得されます

回転 = ユーザーが指定した回転係数です

4

2 に答える 2

2

これがあなたの問題です。ここrowsではなく、乗算する必要があります。cols

PIXEL* n = (*new)+((cols-col-1)*rows) + row;

新しい画像の行の幅を掛けたいとします。これは、元の画像の行数と同じです。

また、ここで行と列を交換する必要があります。

*newcols = rows;
*newrows = cols;

-90 度回転するには:

PIXEL* n = (*new)+(col*rows) + (rows-row-1);
*newcols = rows;
*newrows = cols;

180 度回転するには:

PIXEL* n = (*new)+((rows-row-1)*cols) + (cols-col-1);
*newcols = cols;
*newrows = rows;

一般に、式は次のとおりです。

PIXEL* n = (*new)+(newrow*newcols) + newcol;

以前のローテーションされていない BMP から newrow、newcols、および newcol を決定する方法を理解する必要があるだけです。絵を描くことが役に立ちます。

于 2013-11-05T21:41:40.937 に答える
1

コードの一部だけを考えると推測するのは少し難しいですが、この行は確かに間違っているようです:

PIXEL* o = original+ (row*newCols) + col;

newCols元の画像とは対照的に、新しく作成された画像の幅が である場合、このアドレス指定は間違っています。代わりに次のことをしているつもりはありませんか?

PIXEL* o = original+ (row*cols) + col;
于 2013-11-05T20:26:17.603 に答える