【发布时间】:2021-07-05 18:33:09
【问题描述】:
我正在尝试支持从 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 中的 JPEG 以 90 度增量旋转,而质量损失最小或没有损失?谢谢。
另外,这是我对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) {
【问题讨论】:
-
您的代码对我有效。您确定为您的数据返回 ImageCodecInfo 吗?
-
谢谢@pb,我得到的是 ImageCodecInfo 但不是 encoderParams 因为我的实际代码在设置它之前有一个额外的检查,它有一个错误。
标签: .net image-processing jpeg