6

画像を回転させようとしています。pictureBox369x276があります。しかし、回転させると、このサイズは小さくなります。

pictureBoxsizeModeはPictureBoxSizeMode.StretchImageです。

これが私のコードです:

        Bitmap oldBitmap = (Bitmap)pictureBox1.Image;
        float angle = 90;
        var newBitmap = new Bitmap(oldBitmap.Width, oldBitmap.Height);

        var graphics = Graphics.FromImage(newBitmap);
        graphics.TranslateTransform((float)oldBitmap.Width  / 2, (float)oldBitmap.Height / 2);
        graphics.RotateTransform(angle);
        graphics.TranslateTransform(-(float)oldBitmap.Width / 2, -(float)oldBitmap.Height / 2);
        graphics.DrawImage(oldBitmap, new Point(0, 0));
        pictureBox1.Image = newBitmap;
4

2 に答える 2

4

RotateFlipを使用するだけです。

Bitmap oldBitmap = (Bitmap)pictureBox1.Image;
oldBitmap.RotateFlip(RotateFlipType.Rotate90FlipNone);
pictureBox1.Image = oldBitmap;

@ Dan-oが指摘しているように、これにより、System.Drawing.RotateFlipType列挙型の任意の次数の回転が可能になります。

サイズを失うことなくビットマップを任意の角度で回転させるには、次のようにすることができますが、少し複雑です。

1つ-WriteableBitmapExライブラリをプロジェクトに追加します

2 -XAML、WindowsBase、およびPresentationCoreライブラリをプロジェクトに追加します

3-以下を使用して、ビットマップを任意の角度で回転させます。

class Program
{
    static void Main(string[] args)
    {
        Bitmap oldBitmap = (Bitmap)pictureBox1.Image;;

        var bitmapAsWriteableBitmap = new WriteableBitmap(BitmapToBitmapImage(oldBitmap));
        bitmapAsWriteableBitmap.RotateFree(23);

        var rotatedImageAsMemoryStream = WriteableBitmapToMemoryStream(bitmapAsWriteableBitmap);
        oldBitmap = new Bitmap(rotatedImageAsMemoryStream);
    }

    public static BitmapImage BitmapToBitmapImage(Bitmap bitmap)
    {
        var memStream = BitmapToMemoryStream(bitmap);
        return MemoryStreamToBitmapImage(memStream);
    }

    public static MemoryStream BitmapToMemoryStream(Bitmap image)
    {
        var memoryStream = new MemoryStream();
        image.Save(memoryStream, ImageFormat.Bmp);

        return memoryStream;
    }

    public static BitmapImage MemoryStreamToBitmapImage(MemoryStream ms)
    {
        ms.Position = 0;
        var bitmap = new BitmapImage();

        bitmap.BeginInit();

        bitmap.StreamSource = ms;
        bitmap.CacheOption = BitmapCacheOption.OnLoad;

        bitmap.EndInit();
        bitmap.Freeze();

        return bitmap;
    }

    private static MemoryStream WriteableBitmapToMemoryStream(WriteableBitmap writeableBitmap)
    {
        var ms = new MemoryStream();

        var encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(writeableBitmap));

        encoder.Save(ms);

        return ms;
    }
}

お尻の痛みが、動作します!

于 2013-03-14T17:01:38.687 に答える
2

より小さな画像サイズが期待されます。理由はわかりませんが、Graphics.DrawImage実際には、開始位置だけでなくサイズも指定した場合にのみ機能します。オーバーロードの1つでは、サイズを含めることができます。

于 2013-03-14T17:06:05.173 に答える