.net - 在 .NET 中旋转 JPEG,质量损失最小

标签 .net image-processing jpeg

我正在尝试支持从 ASP.NET MVC 旋转 JPEG 图像(以 90 度增量)。我正在尝试使用 System.Drawing (GDI+),但是我遇到了问题。

我尝试使用Image.RotateFlip它能够旋转图像但会导致质量损失。即使编码器质量为 100,旋转后的图像上仍然存在原始图像上没有的可见伪影,当我使用其他程序(Gimp 等)旋转它时,它们也不会出现。

using (Image image = Image.FromFile("C:\\source.jpg")) {
    ImageFormat sourceFormat = image.RawFormat;
    image.RotateFlip(RotateFlipType.Rotate90FlipNone);
    EncoderParameters encoderParams = null;
    try {
        if (sourceFormat == ImageFormat.Jpeg) {
            encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
        }
        image.Save("C:\\target.jpg", GetEncoder(sourceFormat), encoderParams);
    } finally {
        if (encoderParams != null)
            encoderParams.Dispose();
    }
}

我发现一篇关于transforming a JPEG without loss of information的文章。使用 Encoder.Transformation 似乎是 .NET 的一个选项 - 但是我无法让它使我的任何 JPEG 测试图像完全旋转,无论尺寸是否是 16 的倍数。

using (Image image = Image.FromFile("C:\\source.jpg")) {
    ImageFormat sourceFormat = image.RawFormat;
    EncoderParameters encoderParams = null;
    try {
        if (sourceFormat == ImageFormat.Jpeg) {
            encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = new EncoderParameter(Encoder.Transformation, 
                (long)EncoderValue.TransformRotate90);
        }
        image.Save("C:\\target.jpg", GetEncoder(sourceFormat), encoderParams);
    } finally {
        if (encoderParams != null)
            encoderParams.Dispose();
    }
}

有谁知道如何使用上述方法或其他方法在 .NET 中以 90 度增量成功旋转 JPEG,而质量损失最小或没有质量损失?谢谢。

此外,这是我的 GetEncoder 实现:

private ImageCodecInfo GetEncoder(ImageFormat format) {
    foreach (var info in ImageCodecInfo.GetImageEncoders())
        if (info.FormatID == format.Guid)
            return info;
    return null;
}

编辑:

我更新了上面的代码以更好地匹配我的实际代码。该错误位于以下行:

if (sourceFormat == ImageFormat.Jpeg) {

应该是:

if (sourceFormat.Guid == ImageFormat.Jpeg.Guid) {

最佳答案

感谢您确认我发布的代码有效。这帮助我隔离了我的问题。我现在觉得自己很蠢。我的实际代码在设置 encoderParams 之前检查了图像格式 - 但它有一个错误:

if (sourceFormat == ImageFormat.Jpeg) {
    // set encoderParams here

我发现上述条件始终为 false,因此未设置 encoderParams。修复很简单:

if (sourceFormat.Guid == ImageFormat.Jpeg.Guid) {

关于.net - 在 .NET 中旋转 JPEG,质量损失最小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1186708/

相关文章:

php - GD 可以选择渐进式 JPEG 中的隔行扫描深度吗?

jpeg - 解析 JPEG SOS 标记

.net - 生成唯一 ID(检查或不检查)?

image-processing - Tesseract:如何一次用多种语言运行tesseract

ubuntu - 如何在 Ubuntu 上从 JPEG 或其他图像创建 YUV422 帧

matlab - 读取 DICOM-RT 文件以创建 3D 二进制矩阵?

c# - 类似于 .NET 框架中的 sql IN 语句?

c# - WP7 ListBox如何允许用户订购项目

.net - 为什么 .NET Array 类复制这么慢?

image - 地址簿中人的ImageData(CFDataRef)是什么格式?(Jpeg还是PNG)?或者如何确定?