首页 > 代码库 > 重写HttpPostedFileBase 图片压缩
重写HttpPostedFileBase 图片压缩
遇到一个场景 文件操作模块是其他同事编写 直接通过HttpPostedFileBase来保存图片 这边不能动原来的上传流程 原来上传的图片都是没有经过压缩 导致APP加载速度会很慢
图片压缩代码
参考自:https://github.com/zkweb-framework/ZKWeb/blob/master/ZKWeb/ZKWebStandard/Extensions/ImageExtensions.cs
using MyCompanyName.Extensions.Utils; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MyCompanyName.Extensions.Extensions { public static class ImageExtensions { /// <summary> /// Resize image /// </summary> /// <param name="image">Original image</param> /// <param name="width">Width</param> /// <param name="height">height</param> /// <param name="mode">Resize mode</param> /// <param name="background">Background default is transparent</param> /// <returns></returns> public static Image Resize(this Image image, int width, int height, ImageResizeMode mode, Color? background = null) { var src = http://www.mamicode.com/new Rectangle(0, 0, image.Width, image.Height);"image">Image object</param> /// <param name="filename">File path, will automatic create parent directories</param> /// <param name="quality">Compress quality, 1~100</param> public static void SaveJpeg(this Image image, string filename, long quality) { PathUtils.EnsureParentDirectory(filename); var encoder = ImageCodecInfo.GetImageEncoders().First( c => c.FormatID == ImageFormat.Jpeg.Guid); var parameters = new EncoderParameters(); parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); image.Save(filename, encoder, parameters); } /// <summary> /// Save to icon, see /// http://stackoverflow.com/questions/11434673/bitmap-save-to-save-an-icon-actually-saves-a-png /// </summary> /// <param name="image">Image object</param> /// <param name="filename">File path, will automatic create parent directories</param> public static void SaveIcon(this Image image, string filename) { PathUtils.EnsureParentDirectory(filename); using (var stream = new FileStream(filename, FileMode.Create)) { // Header (ico, 1 photo) stream.Write(new byte[] { 0, 0, 1, 0, 1, 0 }, 0, 6); // Size stream.WriteByte(checked((byte)image.Width)); stream.WriteByte(checked((byte)image.Height)); // No palette stream.WriteByte(0); // Reserved stream.WriteByte(0); // No color planes stream.Write(new byte[] { 0, 0 }, 0, 2); // 32 bpp stream.Write(new byte[] { 32, 0 }, 0, 2); // Image data length, set later stream.Write(new byte[] { 0, 0, 0, 0 }, 0, 4); // Image data offset, fixed 22 here stream.Write(new byte[] { 22, 0, 0, 0 }, 0, 4); // Write png data image.Save(stream, ImageFormat.Png); // Write image data length long imageSize = stream.Length - 22; stream.Seek(14, SeekOrigin.Begin); stream.WriteByte((byte)(imageSize)); stream.WriteByte((byte)(imageSize >> 8)); stream.WriteByte((byte)(imageSize >> 16)); stream.WriteByte((byte)(imageSize >> 24)); } } /// <summary> /// Save image by it‘s file extension /// Quality parameter only available for jpeg /// </summary> /// <param name="image">Image object</param> /// <param name="filename">File path, will automatic create parent directories</param> /// <param name="quality">Compress quality, 1~100</param> public static void SaveAuto(this Image image, string filename, long quality) { PathUtils.EnsureParentDirectory(filename); var extension = Path.GetExtension(filename).ToLower(); if (extension == ".jpg" || extension == ".jpeg") { image.SaveJpeg(filename, quality); } else if (extension == ".bmp") { image.Save(filename, ImageFormat.Bmp); } else if (extension == ".gif") { image.Save(filename, ImageFormat.Gif); } else if (extension == ".ico") { image.SaveIcon(filename); } else if (extension == ".png") { image.Save(filename, ImageFormat.Png); } else if (extension == ".tiff") { image.Save(filename, ImageFormat.Tiff); } else if (extension == ".exif") { image.Save(filename, ImageFormat.Exif); } else { throw new NotSupportedException( string.Format("unsupport image extension {0}", extension)); } } } /// <summary> /// Image resize mode /// </summary> public enum ImageResizeMode { /// <summary> /// Resize to the specified size, allow aspect ratio change /// </summary> Fixed, /// <summary> /// Resize to the specified width, height is calculated by the aspect ratio /// </summary> ByWidth, /// <summary> /// Resize to the specified height, width is calculated by the aspect ratio /// </summary> ByHeight, /// <summary> /// Resize to the specified size, keep aspect ratio and cut the overflow part /// </summary> Cut, /// <summary> /// Resize to the specified size, keep aspect ratio and padding the insufficient part /// </summary> Padding } }
重写HttpPostedFileBase
using MyCompanyName.Extensions.Extensions; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; namespace MyCompanyName.Extensions.Web.Http { public class ImageHttpPostedFileBase : HttpPostedFileBase { Stream stream; string contentType; string fileName; public int ImageQuality { get; set; } public Size ImageThumbnailSize { get; set; } public ImageResizeMode ImageResizeMode { get; set; }
public ImageHttpPostedFileBase(Stream stream, string contentType, string fileName, Size imageThumbnailSize, int ImageQuality, ImageResizeMode imageResizeMode) { this.stream = stream; this.contentType = contentType; this.fileName = fileName; this.ImageQuality = ImageQuality; this.ImageThumbnailSize = imageThumbnailSize; this.ImageResizeMode = imageResizeMode; } public override int ContentLength { get { return (int)stream.Length; } } public override string ContentType { get { return contentType; } } public override string FileName { get { return fileName; } } public override Stream InputStream { get { return stream; } } public override void SaveAs(string filename) { var image = Image.FromStream(stream); using (var thumbnailImage = image.Resize(ImageThumbnailSize.Width, ImageThumbnailSize.Height, ImageResizeMode, Color.White)) thumbnailImage.SaveAuto(filename, ImageQuality); } } }
重写HttpPostedFileBase加入了一些自定义的属性 SoEasy
ImageHttpPostedFileBase fileBase = new ImageHttpPostedFileBase(file.InputStream, file.ContentType, file.FileName, new Size(800, 800), 90, Extensions.Extensions.ImageResizeMode.ByWidth);
重写HttpPostedFileBase 图片压缩
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。