Rotating JPEGs in .NET with minimal loss of quality(以最小的质量损失在.NET中旋转JPG)
问题描述
我正在尝试支持从ASP.NET MVC(以90度为增量)旋转JPEG图像。我正在尝试使用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
我发现上面的条件总是假的,所以没有设置encoderParams
。解决方法很简单:
if (sourceFormat.Guid == ImageFormat.Jpeg.Guid) {
这篇关于以最小的质量损失在.NET中旋转JPG的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:以最小的质量损失在.NET中旋转JPG
基础教程推荐
- 如何激活MC67中的红灯 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- c# Math.Sqrt 实现 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- rabbitmq 的 REST API 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01