web-dev-qa-db-ja.com

C#ビットマップを90度回転

次の関数を使用してビットマップを90度回転しようとしています。問題は、高さと幅が等しくないときに画像の一部が切り取られることです。

ReturnBitmapの幅= original.heightとその高さ= original.widthに注意してください。

誰でもこの問題の解決を手伝ったり、私が間違っていることを指摘したりできますか?

    private Bitmap rotateImage90(Bitmap b)
    {
        Bitmap returnBitmap = new Bitmap(b.Height, b.Width);
        Graphics g = Graphics.FromImage(returnBitmap);
        g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
        g.RotateTransform(90);
        g.TranslateTransform(-(float)b.Width / 2, -(float)b.Height / 2);
        g.DrawImage(b, new Point(0, 0));
        return returnBitmap;
    }
48
Kevin

this についてはどうですか:

private void RotateAndSaveImage(String input, String output)
{
    //create an object that we can use to examine an image file
    using (Image img = Image.FromFile(input))
    {
        //rotate the picture by 90 degrees and re-save the picture as a Jpeg
        img.RotateFlip(RotateFlipType.Rotate90FlipNone);
        img.Save(output, System.Drawing.Imaging.ImageFormat.Jpeg);
    }
}
93
Rubens Farias

バグはTranslateTransformへの最初の呼び出しにあります:

g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);

この変換は、returnBitmapではなくbの座標空間にある必要があるため、次のようにする必要があります。

g.TranslateTransform((float)b.Height / 2, (float)b.Width / 2);

または同等に

g.TranslateTransform((float)returnBitmap.Width / 2, (float)returnBitmap.Height / 2);

2番目のTranslateTransformは、回転の前に適用されるため正しいです。

ただし、Rubens Fariasが提案したように、おそらくより単純なRotateFlipメソッドを使用した方がよいでしょう。

9
finnw

私は出くわし、少し修正を加えて動作するようになりました。他の例をいくつか見つけて、何かが足りないことに気づきました。画像が間違ったサイズになっていない場合、SetResolutionを呼び出す必要がありました。また、高さと幅が後方にあることに気付きましたが、とにかく非正方形の画像に何らかの修正があると思います。同じ問題で私がやったようにこれに出くわした人のためにこれを投稿すると思った。

ここに私のコードがあります

private static void RotateAndSaveImage(string input, string output, int angle)
{
    //Open the source image and create the bitmap for the rotatated image
    using (Bitmap sourceImage = new Bitmap(input))
    using (Bitmap rotateImage = new Bitmap(sourceImage.Width, sourceImage.Height))
    {
        //Set the resolution for the rotation image
        rotateImage.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution);
        //Create a graphics object
        using (Graphics gdi = Graphics.FromImage(rotateImage))
        {
            //Rotate the image
            gdi.TranslateTransform((float)sourceImage.Width / 2, (float)sourceImage.Height / 2);
            gdi.RotateTransform(angle);
            gdi.TranslateTransform(-(float)sourceImage.Width / 2, -(float)sourceImage.Height / 2);
            gdi.DrawImage(sourceImage, new System.Drawing.Point(0, 0));
        }

        //Save to a file
        rotateImage.Save(output);
    }
}
2
thecaptain0220