开源免费的.NET图像即时处理的组件ImageProcessor
承接以前的组件系列,这个组件系列旨在介绍.NET相关的组件,让大家可以在项目中有一个更好的选择,社区对于第三方插件的介绍还是比较少的,很多博文的内容主要还是介绍一些简单的操作(很多人都说博客园现在是“hello world”的水平,博文质量在下降,对于这一说法,我觉得这个说法有些过头了,可能一些博文的确写的比较初级,但是很多博文的深入还是比较大,只是很少受人关注),这个组件系列主要在介绍一些功能的组件,附带该组件的核心对象介绍。
组件的介绍绝对不是一篇文章可以叙述完的,因为一个组件是经过开发者很长周期的开发,绝不是我这里一篇简单的博文就可以介绍完毕的,组件介绍的系列,一般会沿袭着组件背景介绍、组件使用介绍、核心对象介绍等等内容。如果对组件感兴趣,可以深入的了解和学习。
废话少说,进入正题。
我们在项目中很多时候都会对文件进行处理,例如文件的上传下载等等。其中对图片的实时操作也会较多,在这里介绍一款用C#编写的轻量级库的集合,它允许你使用.NET 4.5+来动态地处理图像的组件,那就是ImageProcessor,用于图像的即时处理的.NET库。(组织的开源项目组,会经过第一个项目的磨合后,第二项目会开发一个.NET Core组件)
一.ImageProcessor组件概述
ImageProcessor是用C#编写的轻量级库的集合,它允许你使用.NET 4.5+来动态地处理图像,包括两个主库ImageProcessor(用于桌面和应用程序使用)ImageProcessor.Web(ASP.NET构建的动态图像处理扩展),该组件快速,可扩展,易于使用,捆绑了一些很强大的功能,而且是完全开源。该组件有两个部分,我们今天将主要讲解ImageProcessor部分的内容,如果对另外一个感兴趣,可以自行了解。
ImageProcessor.Web向项目添加了一个可配置的HttpModule,允许对图像文件进行即时处理。该模块还提供了一个基于文件和浏览器的缓存,可以处理数百万的图像,增加处理输出和节省宝贵的服务器内存。该组件的功能方法包括:调整大小,旋转,圆角,翻转,裁剪,水印,过滤器,饱和度,亮度,对比度,质量,格式,小插曲,高斯模糊,高斯锐化和透明度。
ImageProcessor.Web的当前版本是4.8.2,可以下载源码和DLL文件(本人建议最好下载源码,好处就不在这里赘述)。
ImageProcessor.Web是ImageProcessor的Web扩展,允许开发人员使用Url API的查询字符串参数作为指令执行图像操作。此过程的输出是高度优化的网络,以确保web项目较高的性能。安装ImageProcessor.Web时,默认情况下,Web.config中添加配置节点,如下节点。
<add name="ImageProcessorModule" type="ImageProcessor.Web.HttpModules.ImageProcessingModule, ImageProcessor.Web" /></httpModules>
这允许库ImageProcessingModule拦截本地图像处理请求。ImageProcessor.Web是高度可配置的。可以将其他配置文件添加到解决方案中,以便从多个来源检索,处理和缓存图像。对于该组件的配置设置可以查看文档。
二.ImageProcessor组件操作概述
介绍了组件的相关信息,在这里介绍一下该组件的操作实例。ImageFactory类提供了对给定图像执行各种操作功能的方法。它经过精心设计以防止在以高性能方式处理图像时通常发生的各种内存泄漏。这使其可以安全地在桌面和Web环境中使用。ImageFactory自动检测给定图像的正确文件类型,并且该类的API是流畅的,这允许您轻松地链接方法以提供所需的输出。例如,以下代码加载,调整大小,设置新格式并保存包含图像信息的MemoryStream。
public static void Image(string file)
{
if (string.IsNullOrEmpty(file))
{
throw new ArgumentNullException(file);
}
byte[] photoBytes = System.IO.File.ReadAllBytes(file);
// 检测格式
ISupportedImageFormat format = new JpegFormat { Quality = 70 };
Size size = new Size(150, 0);
using (MemoryStream inStream = new MemoryStream(photoBytes))
{
using (MemoryStream outStream = new MemoryStream())
{
// 使用重载初始化ImageFactory以保留EXIF元数据。
using (ImageFactory imageFactory = new ImageFactory(true))
{
// 加载,调整大小,设置格式和质量并保存图像。
imageFactory.Load(inStream)
.Resize(size)
.Format(format)
.Save(outStream);
//对获取的imageFactory对象进行对应的操作
}
//对获取的数据流进行操作
}
}
对于图片的操作,具体有较多的操作方式,具体的方法有如下的方法:
方法名称 | 方法操作说明 |
Reset | 将当前图像重置为其原始加载状态 |
Alpha | 更改当前图像的不透明度 |
AutoRotate | 执行自动旋转以确保反映EXIF定义的旋转最终图像 |
BitDepth | 改变当前图像的位深度 |
Brightness | 更改当前图像的亮度 |
BackgroundColor | 更改当前图像的背景颜色 |
Constrain | 约束当前图像,调整其大小以适合给定的尺寸,同时保持其纵横比 |
Contrast | 更改当前图像的对比度 |
Crop | 将当前图像裁剪到给定的位置和大小 |
DetectEdges | 检测当前图像中的边缘 |
Resolution | 设置图像的分辨率 |
EntropyCrop | 将图像修剪到最大熵的区域 |
Filter | 将过滤器应用于当前图像 |
Flip | 水平或垂直翻转当前图像 |
Gamma | 调整给定图像的灰度(光强度)分量 |
GaussianBlur | 使用高斯内核模糊当前图像 |
Hue | 改变当前图像的色调,改变整体颜色 |
Halftone | 将当前图像转换为该图像的CMYK半色调表示 |
Quality | 改变当前图像的输出质量 |
ReplaceColor | 替换当前图像中的颜色 |
Resize | 将当前图像调整为给定尺寸 |
Rotate | 将当前图像旋转给定角度 |
以上只是列出了一些主要的操作方法,还有其他的方法这里就不再介绍,有兴趣可以自己取实践。下面就介绍一下一些核心对象。
三.ImageProcessor核心对象解析
解析来我们具体了解一下核心的方法和属性,看看源码还是有好处。
1.ImageFactory.Load()
public ImageFactory Load(string imagePath)
{
FileInfo fileInfo = new FileInfo(imagePath);
if (fileInfo.Exists)
{
this.ImagePath = imagePath;
using (FileStream fileStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read))
{
ISupportedImageFormat format = FormatUtilities.GetFormat(fileStream);
if (format == null)
{
throw new ImageFormatException("Input stream is not a supported format.");
}
MemoryStream memoryStream = new MemoryStream();
fileStream.CopyTo(memoryStream);
memoryStream.Position = 0;
this.Image = format.Load(memoryStream);
this.CurrentBitDepth = Image.GetPixelFormatSize(this.Image.PixelFormat);
this.InputStream = memoryStream;
format.Quality = DefaultQuality;
format.IsIndexed = FormatUtilities.IsIndexed(this.Image);
this.backupFormat = format;
this.CurrentImageFormat = format;
foreach (PropertyItem propertyItem in this.Image.PropertyItems)
{
this.ExifPropertyItems[propertyItem.Id] = propertyItem;
}
this.backupExifPropertyItems = this.ExifPropertyItems;
IAnimatedImageFormat imageFormat = this.CurrentImageFormat as IAnimatedImageFormat;
if (imageFormat != null)
{
imageFormat.AnimationProcessMode = this.AnimationProcessMode;
}
Image formatted = this.Image.Copy(this.AnimationProcessMode);
this.Image.Dispose();
this.Image = formatted;
this.ShouldProcess = true;
}
}
else
{
throw new FileNotFoundException(imagePath);
}
return this;
}
该方法用来加载要处理的图像的方法, 始终首先调用此方法。该方法具有4个重载版本,分别接收的参数为string,byte[],Image,Stream。FormatUtilities.GetFormat(fileStream)方法从给定流获取正确的ISupportedImageFormat。在对图片的数据流进行操作时,首先会复制图片的流数据。format.Load(memoryStream)将我们的映像设置为内存流值。图片数据流进行一个操作后,会调用Image.Copy(this.AnimationProcessMode)确保图像是最有效的格式。
2.ImageFactoryExtensions.AutoProcess()
internal static ImageFactory AutoProcess(this ImageFactory factory, IWebGraphicsProcessor[] graphicsProcessors)
{
if (factory.ShouldProcess)
{
foreach (IWebGraphicsProcessor graphicsProcessor in graphicsProcessors)
{
factory.CurrentImageFormat.ApplyProcessor(graphicsProcessor.Processor.ProcessImage, factory);
IDisposable disposable = graphicsProcessor.Processor.DynamicParameter as IDisposable;
disposable?.Dispose();
}
}
return factory;
}
ImageFactoryExtensions类是ImageFactory类的扩展类,主要是扩展Web项目。AutoProcess()方法基于添加到图像路径的任何查询字符串参数,自动处理图像文件。graphicsProcessors参数表示要应用的图形处理器阵列。graphicsProcessor.Processor.DynamicParameter as IDisposable打开动态参数并处理任何需要它的类型。
3.ImageProcessingModule.SetHeaders()
public static void SetHeaders(HttpContext context, int maxDays)
{
object responseTypeObject = context.Items[CachedResponseTypeKey];
object dependencyFileObject = context.Items[CachedResponseFileDependency];
string responseType = responseTypeObject as string;
string[] dependencyFiles = dependencyFileObject as string[];
SetHeaders(context, responseType, dependencyFiles, maxDays);
}
在Web扩展中,ImageProcessingModule类比较重要,处理Web应用程序中的任何图像请求。SetHeaders()方法使浏览器和服务器将输出保存在其缓存中,从而提高性能。该方法接受两个参数,context表示请求的http消息对象,HttpContext对象对内在服务器对象的引用。maxDays参数表示将图片存储在浏览器缓存中的最长天数。
四.总结
说句实话,这位作者的编码风格是喜欢的,代码简介明了,没有那么多装逼的写法,不会为了使用一些写法,而去改变代码的可读性。对于这个组件系列,我会近可能的写一些,大家可以借此了解一些组件,需要深入了解和使用的,可以自己查看源码,进行对应的扩展。写完这篇,已经凌晨两点了,为自己点个赞,无论写的怎样,觉得自己还是尽心了。
原文地址:http://www.cnblogs.com/pengze0902/p/6569360.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
开源免费的.NET图像即时处理的组件ImageProcessor相关推荐
- 开源免费的 LoRa App 设计原理和组件
为了帮助 LoRa 用户演示数据和调试开发,开源免费的 LoRa App 推出后深受好评. 下载与使用请链接<开源免费的手机版 LoRa App,演示和调试 LoRaWAN 数据的神器> ...
- JS组件系列——开源免费图表组件:Chart.js
前言:最近被开源免费得有点上火了,各种组件首先想到的就是是开源否.是否免费.是否和bootstrap风格一致.想着以后做报表肯定要用到图表组件的,于是在Bootstrap中文网上面找到了Chart.j ...
- Riot-IM:是一个开源免费的即时通讯聊天协作工具,功能丰富且跨平台——Riot-IM
Riot-IM 介绍 Riot-IM ,一个新型的协作平台,可以在 iOS.Android.Web 端运行,完全由自身控制的通用安全聊天应用程序.支持多大25种语言(支持中文),且还在不断地增加!可 ...
- 一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
在目前的软件项目中,都会较多的使用到对文档的操作,用于记录和统计相关业务信息.由于系统自身提供了对文档的相关操作,所以在一定程度上极大的简化了软件使用者的工作量. 在.NET项目中如果用户提出了相关文 ...
- 分享一个.NET平台开源免费跨平台的大数据分析框架.NET for Apache Spark
今天早上六点半左右微信群里就看到张队发的关于.NET Spark大数据的链接https://devblogs.microsoft.com/dotnet/introducing-net-for-apac ...
- 开源/免费数学书大合集:微积分、线代、数分、抽代…数学教授分类整理,精心推荐...
点击我爱计算机视觉标星,更快获取CVML新技术 栗子 发自 凹非寺 量子位 报道 | 公众号 QbitAI 同学,请来领取一份开源/免费数学书大列表. 这是北亚利桑那大学的数学系副教授Dana C. ...
- 火狐浏览器老版本_谷歌和火狐浏览器将在下个月的新版本中支持开源免费的AVIF图像格式...
AVIF 图像格式是开放媒体联盟 AOMedia 推出的开源免费技术标准,与 AV1 视频编解码技术属于同宗同源的产品.开放媒体联盟此前联合多家制造商和开发商制定 AV1 标准,目前 AV1 标准已经 ...
- 开源免费的图片压缩软件,从50M到50K,极力安利
我相信大家在生活中肯定每日都离不开图片的处理了,比如:考试报名.图片传送.网页图片上传的过程中,都或多或少遇到过"您上传的图片太大"的问题 每次遇到这种情况是真的有点心塞,所以今天 ...
- 开源免费图片文字识别 OCR 工具 tesseract v4.1.0 的 Docker 镜像制作与使用
开源免费图片文字识别 OCR 工具 tesseract v4.1.0 的 Docker 镜像制作与使用 一 背景 在日常的一些工作中,偶尔也需要我们把图片转换为文字.目前大部分办公软件还无法实现类似的 ...
最新文章
- 关于SpringMVC和Struts2的区别
- 图解DotNet框架系列
- 17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列
- 修改所有列_多人编辑,自动汇总,领导可见所有?用 SeaTable 表格更简单
- jupyter|魔法函数问题| UsageError: Line magic function `%` not found
- 配置JDK时发生'javac'不是内部或外部命令的现象与解决过程
- idea如何设置自动换行
- 微服务一定要使用Spring-Cloud吗?
- linux cmake编译安装mysql_Linux源码安装MySQL 5.6.12 (Cmake编译)
- java 抽象属性_怎样在java中定义一个抽象属性
- Eclipes中AndbaseDemo 手动导入 Android studio
- 实验1 VLAN负载均衡
- 优控触摸屏使用手册_中达优控PLC触摸屏一体机说明书.pdf
- SWAT模型 建模方法、实例应用、高级进阶
- Machine learning system design - Data for machine learning
- java this 逸出_Java并发编程——this逸出解决方法的思考
- Flutter | super.dispose() 的调用顺序
- 笔记本连接显示器后没有声音_笔记本连外接显示器没声音怎么办
- 摄影图片分享网站项目制作总结
- 201771010137赵栋《第八周学习总结》