1

C# で画像を回転させる次のコードがあります。

    using (var stream = new FileStream(path, FileMode.Open))
    {
        using (var image = Image.FromStream(stream))
        {
            stream.Close();
            image.RotateFlip(rotateType);
            image.Save(path1, ImageFormat.Png);
            image.Dispose();
        }
    }

元のファイル サイズが 700 KiB の場合、新しくローテーションされたファイルのサイズは 7+ MiB になります。

このコードの何が問題になっていますか? どんな助けでも大歓迎です。

アップデート:

image.Save(path1, ImageFormat.Png)image.Save(path1)andimage.Save(path1, image.RawFormt)に変更してみましたが、改善されませんでした。

4

2 に答える 2

0

C# - PNG の品質または色深度を変更する方法

この男の質問は、あなたが見ているのと同じように見えます。

于 2013-10-14T16:44:41.143 に答える
0

PNG はビットマップ ファイル形式です。

  • jpgに比べてファイルサイズが大きい

このため、画像を jpg として安全にする必要があります。

したがって、ロスレス PNG 形式は、まだ編集中の写真に最適です。また、JPEG などの非可逆形式は、写真画像の最終的な配布に最適です。この場合、JPG ファイルは通常小さいため [...]

出典:ウィキペディア

次の方法で JPEG の画像を保護してみてください。

image.Save(path, YourClass.GetImageFormat(image));

テスト:
この方法で JPG ファイルを回転すると、サイズは変わりません。
15.7MiB の BMP ファイルをローテーションすると、新しいサイズは ~800kiB になります。

既存のファイル形式を使用するには、次の拡張メソッドを使用します。

public static System.Drawing.Imaging.ImageFormat GetImageFormat(System.Drawing.Image img)
{             
    if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg))
        return System.Drawing.Imaging.ImageFormat.Jpeg;
    if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Bmp))
        return System.Drawing.Imaging.ImageFormat.Bmp;
    if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Png))
        return System.Drawing.Imaging.ImageFormat.Png;
    if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Emf))
        return System.Drawing.Imaging.ImageFormat.Emf;
    if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Exif))
        return System.Drawing.Imaging.ImageFormat.Exif;
    if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Gif))
        return System.Drawing.Imaging.ImageFormat.Gif;
    if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Icon))
        return System.Drawing.Imaging.ImageFormat.Icon;
    if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.MemoryBmp))
        return System.Drawing.Imaging.ImageFormat.MemoryBmp;
    if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Tiff))
        return System.Drawing.Imaging.ImageFormat.Tiff;
    else
        return System.Drawing.Imaging.ImageFormat.Wmf;            
}

出典:スタックオーバーフロー

画像を操作する前に、フォーマットを探す必要があることに注意してください。
そうしないと、画像は として認識されMemoryBmpます。

using (var stream = new FileStream(path, FileMode.Open))
        {
            using (var image = Image.FromStream(stream))
            {
                stream.Close();
                var format = YourClass.GetImageFormat(image);
                image.RotateFlip(RotateFlipType.Rotate180FlipNone);
                image.Save(path, format);
                image.Dispose();
            }
        }
于 2013-10-14T16:38:52.503 に答える