開源免費的.NET圖像即時處理的組件ImageProcessor

   承接之前的組件系列,這個組件系列旨在介紹.NET相關的組件,讓你們能夠在項目中有一個更好的選擇,社區對於第三方插件的介紹仍是比較少的,不少博文的內容主要仍是介紹一些簡單的操做(不少人都說博客園如今是「hello world」的水平,博文質量在降低,對於這一說法,我以爲這個說法有些過頭了,可能一些博文的確寫的比較初級,可是不少博文的深刻仍是比較大,只是不多受人關注),這個組件系列主要在介紹一些功能的組件,附帶該組件的核心對象介紹。web

   組件的介紹絕對不是一篇文章能夠敘述完的,由於一個組件是通過開發者很長週期的開發,毫不是我這裏一篇簡單的博文就能夠介紹完畢的,組件介紹的系列,通常會沿襲着組件背景介紹、組件使用介紹、核心對象介紹等等內容。若是對組件感興趣,能夠深刻的瞭解和學習。瀏覽器

   廢話少說,進入正題。緩存

   咱們在項目中不少時候都會對文件進行處理,例如文件的上傳下載等等。其中對圖片的實時操做也會較多,在這裏介紹一款用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.WebImageProcessor的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。this

  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參數表示將圖片存儲在瀏覽器緩存中的最長天數。

四.總結

   說句實話,這位做者的編碼風格是喜歡的,代碼簡介明瞭,沒有那麼多裝逼的寫法,不會爲了使用一些寫法,而去改變代碼的可讀性。對於這個組件系列,我會近可能的寫一些,你們能夠藉此瞭解一些組件,須要深刻了解和使用的,能夠本身查看源碼,進行對應的擴展。寫完這篇,已經凌晨兩點了,爲本身點個贊,不管寫的怎樣,以爲本身仍是盡心了。

相關文章
相關標籤/搜索