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)并且image.Save(path1, image.RawFormt)没有任何改进。

4

2 回答 2

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 回答
0

C# - 如何更改 PNG 质量或颜色深度

这个人的问题看起来和你看到的一样。

于 2013-10-14T16:44:41.143 回答