我正在尝试支持从 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/