次の関数を使用してビットマップを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;
}
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);
}
}
バグは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
メソッドを使用した方がよいでしょう。
私は出くわし、少し修正を加えて動作するようになりました。他の例をいくつか見つけて、何かが足りないことに気づきました。画像が間違ったサイズになっていない場合、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);
}
}