我試圖支持從ASP.NET MVC(以90度遞增)旋轉JPEG圖像。我試圖使用System.Drawing
(GDI +),但是我遇到了問題。在.NET中旋轉JPEG,質量損失最小
我試過使用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();
}
}
多有誰知道如何使用上述方法或其他方法,以90度遞增的方式成功地在.NET中旋轉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) {
您的代碼適用於我..你確定爲你的數據返回一個ImageCodecInfo? – 2009-07-27 06:49:42