System.Drawing.Image.RotateFlip(RotateFlipType)

时间:2013-10-14 16:17:30

标签: c# image rotation

我有以下代码在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)image.Save(path1, image.RawFormt)但没有任何改进。

2 个答案:

答案 0 :(得分:0)

PNG是一种位图文件格式:

  • 与jpg相比较高的文件大小

因此,你应该把你的形象保存为jpg:

  

因此,无损PNG格式最适合仍在编辑中的图片 - 而像JPEG这样的有损格式最适合最终分发摄影图像,因为在这种情况下,JPG文件通常较小[...]

来源:wikipedia

尝试通过以下方式在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;            
}

来源:StackOverflow

请记住,在操作图像之前必须先查找格式。
否则,图像将被识别为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();
            }
        }

答案 1 :(得分:0)

C# - How to change PNG quality or color depth

这家伙的问题与您所看到的相似。