调整图片尺寸时图片旋转:如何保留原图方向?
问题
我正在上传经WPF应用编辑的JPG图片,为节省存储空间需将图片调整至最大宽度。当前代码可缩小大尺寸图片,但会将所有图片旋转为横向;部分原本已是横向的图片甚至会被旋转180度。
当前代码如下:
public void PrepareImageToUpload(string fileLocation) { BitmapImage myBitmapImage = new BitmapImage(); myBitmapImage.BeginInit(); myBitmapImage.UriSource = new Uri(fileLocation); myBitmapImage.CacheOption = BitmapCacheOption.None; myBitmapImage.DecodePixelWidth = 2000; myBitmapImage.EndInit(); byte[] data; JpegBitmapEncoder encoder = new JpegBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(myBitmapImage)); using (MemoryStream ms = new MemoryStream()) { encoder.Save(ms); data = ms.ToArray(); } string filename = Path.GetFileName(fileLocation); string body = Convert.ToBase64String(data); string mimeType = "image/jpeg"; MyFileUploader(fileName, body, mimeType); }
请问应如何修改代码,才能在调整图片尺寸的同时保留原图方向?
解决方法
原WPF自带的BitmapImage和JpegBitmapEncoder处理图片时,会忽略JPG的EXIF方向信息,导致图片旋转异常。改用ImageSharp库可以正确读取并保留图片的EXIF方向,同时完成尺寸调整。
使用ImageSharp的示例代码如下:
using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.Processing; public void PrepareImageToUpload(string fileLocation) { byte[] data; using (var image = Image.Load(fileLocation)) { // ImageSharp默认会自动应用EXIF方向,无需额外处理 // 调整图片宽度至最大2000,高度按比例自适应 image.Mutate(x => x.Resize(new ResizeOptions { Size = new Size(2000, 0), Mode = ResizeMode.Max })); using (var ms = new MemoryStream()) { // 可根据需求调整JPG质量参数 image.Save(ms, new JpegEncoder { Quality = 80 }); data = ms.ToArray(); } } string filename = Path.GetFileName(fileLocation); string body = Convert.ToBase64String(data); string mimeType = "image/jpeg"; MyFileUploader(filename, body, mimeType); }
使用前需通过NuGet安装ImageSharp包:Install-Package SixLabors.ImageSharp
内容的提问来源于stack exchange,提问作者intrixius
相关产品推荐
相关产品推荐

