1. 程式人生 > >逆天通用水印支援Winform,WPF,Web,WP,Win10。支援位置選擇(9個位置 ==》[X])

逆天通用水印支援Winform,WPF,Web,WP,Win10。支援位置選擇(9個位置 ==》[X])

    /// <summary>
    /// 水印幫助類
    /// </summary>
    public class WaterMarkHelper
    {
        #region 設定水印
        /// <summary>
        /// 設定水印
        /// </summary>
        /// <param name="imgPath"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        public static Image SetWaterMark(string imgPath, WaterMark model)
        {
            //獲取背景圖
            Image imgSource = Image.FromFile(imgPath);
            //獲取水印圖片
            Image markImg = null;

            //水印檢驗(文字,圖片[路徑下是否存在圖片])
            #region 水印校驗+水印處理
            if (model == null)
            {
                return null;
            }
            //看看原圖是否存在
            if (!System.IO.File.Exists(imgPath))
            {
                return null;
            }
            //根據水印型別校驗+水印處理
            switch (model.WaterMarkType)
            {
                case WaterMarkAPP.Enums.WaterMarkTypeEnum.Text:
                    if (string.IsNullOrEmpty(model.Text))
                    {
                        return null;
                    }
                    else
                    {
                        markImg = TextToImager(model);//水印處理-如果是文字就轉換成圖片
                    }
                    break;
                case WaterMarkAPP.Enums.WaterMarkTypeEnum.Image:
                    if (!System.IO.File.Exists(model.ImgPath))
                    {
                        return null;
                    }
                    else
                    {
                        //獲得水印影象           
                        markImg = Image.FromFile(model.ImgPath);
                    }
                    break;
                case WaterMarkAPP.Enums.WaterMarkTypeEnum.NoneMark:
                    return imgSource;
            }
            #endregion

            #region 建立顏色矩陣
            //建立顏色矩陣
            float[][] ptsArray ={ 
                                 new float[] {1, 0, 0, 0, 0},
                                 new float[] {0, 1, 0, 0, 0},
                                 new float[] {0, 0, 1, 0, 0},
                                 new float[] {0, 0, 0, model.Transparency, 0}, //注意:0.0f為完全透明,1.0f為完全不透明
                                 new float[] {0, 0, 0, 0, 1}};
            ColorMatrix colorMatrix = new ColorMatrix(ptsArray);
            //新建一個Image屬性
            ImageAttributes imageAttributes = new ImageAttributes();
            //將顏色矩陣新增到屬性
            imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Default);
            #endregion

            //原圖格式檢驗+水印
            #region 原圖格式檢驗+水印

            //判斷是否是索引影象格式
            if (imgSource.PixelFormat == PixelFormat.Format1bppIndexed || imgSource.PixelFormat == PixelFormat.Format4bppIndexed || imgSource.PixelFormat == PixelFormat.Format8bppIndexed)
            {
                #region 索引圖片,轉成點陣圖再加圖片
                //轉成點陣圖,這步很重要 
                Bitmap bitmap = new Bitmap(imgSource.Width, imgSource.Height);
                Graphics graphic = Graphics.FromImage(bitmap);

                #region 縮放處理
                //如果原圖小於水印圖片 等比縮放水印圖
                if (markImg.Width >= imgSource.Width || markImg.Height >= imgSource.Height)
                {
                    markImg = ImageShrink(imgSource, markImg);
                }
                #endregion

                #region 水印位置
                //水印位置
                int x;
                int y;
                WaterMarkLocations(model, imgSource, markImg, out x, out y);
                #endregion

                //將原圖畫在點陣圖上
                graphic.DrawImage(imgSource, new Point(0, 0));

                //將水印加在點陣圖上
                graphic.DrawImage(markImg, new Rectangle(x, y, markImg.Width, markImg.Height), 0, 0, markImg.Width, markImg.Height, GraphicsUnit.Pixel, imageAttributes);

                graphic.Dispose();
                return bitmap;
                #endregion
            }
            else
            {
                #region 非索引圖片,直接在上面加上水印
                Graphics graphic = Graphics.FromImage(imgSource);

                #region 縮放處理
                //如果原圖小於水印圖片 等比縮放水印圖
                if (markImg.Width >= imgSource.Width || markImg.Height >= imgSource.Height)
                {
                    markImg = ImageShrink(imgSource, markImg);
                }
                #endregion

                #region 水印位置
                //水印位置
                int x;
                int y;
                WaterMarkLocations(model, imgSource, markImg, out x, out y);
                #endregion

                //將水印加在原圖上
                graphic.DrawImage(markImg, new Rectangle(x, y, markImg.Width, markImg.Height), 0, 0, markImg.Width, markImg.Height, GraphicsUnit.Pixel, imageAttributes);

                graphic.Dispose();
                return imgSource;
                #endregion
            }
            #endregion
        } 
        #endregion

        #region 水印處理-文字轉圖片
        /// <summary>
        /// 水印處理-文字轉圖片
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        private static Image TextToImager(WaterMark model)
        {
            Font f = new Font(model.FontFamily, model.FontSize, model.FontStyle);
            Bitmap fbitmap = new Bitmap(Encoding.GetEncoding("GBK").GetByteCount(model.Text) / 2 * f.Height, f.Height);
            Graphics gh = Graphics.FromImage(fbitmap);//建立一個畫板;
            gh.SmoothingMode = SmoothingMode.AntiAlias;
            gh.DrawString(model.Text, f, model.BrushesColor, 0, 0);//畫字串
            return fbitmap as Image;
        }
        #endregion

        #region 水印位置
        /// <summary>
        /// 水印位置
        /// </summary>
        /// <param name="model"></param>
        /// <param name="imgSource"></param>
        /// <param name="markImg"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        private static void WaterMarkLocations(WaterMark model, Image imgSource, Image markImg, out int x, out int y)
        {
            x = 0;
            y = 0;
            switch (model.WaterMarkLocation)
            {
                case WaterMarkLocationEnum.TopLeft:
                    x = 0;
                    y = 0;
                    break;
                case WaterMarkLocationEnum.TopCenter:
                    x = imgSource.Width / 2 - markImg.Width / 2;
                    y = 0;
                    break;
                case WaterMarkLocationEnum.TopRight:
                    x = imgSource.Width - markImg.Width;
                    y = 0;
                    break;
                case WaterMarkLocationEnum.CenterLeft:
                    x = 0;
                    y = imgSource.Height / 2 - markImg.Height / 2;
                    break;
                case WaterMarkLocationEnum.CenterCenter:
                    x = imgSource.Width / 2 - markImg.Width / 2;
                    y = imgSource.Height / 2 - markImg.Height / 2;
                    break;
                case WaterMarkLocationEnum.CenterRight:
                    x = imgSource.Width - markImg.Width;
                    y = imgSource.Height / 2 - markImg.Height / 2;
                    break;
                case WaterMarkLocationEnum.BottomLeft:
                    x = 0;
                    y = imgSource.Height - markImg.Height;
                    break;
                case WaterMarkLocationEnum.BottomCenter:
                    x = imgSource.Width / 2 - markImg.Width / 2;
                    y = imgSource.Height - markImg.Height;
                    break;
                case WaterMarkLocationEnum.BottomRight:
                    x = imgSource.Width - markImg.Width;
                    y = imgSource.Height - markImg.Height;
                    break;
            }
        }
        #endregion

        #region 縮放水印
        /// <summary>
        /// 等比縮放水印圖(縮小到原圖的1/3)
        /// </summary>
        /// <param name="imgSource"></param>
        /// <param name="successImage"></param>
        /// <returns></returns>
        private static Image ImageShrink(Image imgSource, Image markImg)
        {
            int w = 0;
            int h = 0;

            Image.GetThumbnailImageAbort callb = null;

            //對水印圖片生成縮圖,縮小到原圖的1/3(以短的一邊為準)                     
            if (imgSource.Width < imgSource.Height)
            {
                w = imgSource.Width / 3;
                h = markImg.Height * w / markImg.Width;
            }
            else
            {
                h = imgSource.Height / 3;
                w = markImg.Width * h / markImg.Height;
            }
            markImg = markImg.GetThumbnailImage(w, h, callb, new System.IntPtr());
            return markImg;
        }
        #endregion
    }

相關推薦

通用水印支援WinformWPFWebWPWin10支援位置選擇9位置 ==》[X]

/// <summary> /// 水印幫助類 /// </summary> public class WaterMarkHelper { #region 設定水印 /// <summary&

通用水印擴充套件篇~新增剪貼簿系列的功能和手動配置卸除原基礎不常用的功能

using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Text; using WaterMarkAPP.Enums; using WaterMarkAPP.

阿裏資深技術專家:在各階段中3年經驗的程序員應該具備哪些技術能力進階必看

Java 後端 進階 3年工作經驗的Java程序員應該具備哪些技術能力,這可能是Java程序員們比較關心的內容。我這裏要說明一下,以下列舉的內容不是都要會的東西,但是你掌握得越多,最終能得到的評價、拿到的薪水勢必也越高。1、基本語法這包括static、final、transient等關鍵字的作用,

Matplotlib學習---matplotlib裏顏色標記線條類型參數的選擇colors, markers, line styles

light bfd hot thead ace silver stl add tpi 顏色(Colors): 基礎顏色: charactercolor ‘b‘ blue ‘g‘ green ‘r‘ red ‘c‘ cyan ‘m‘ magenta

藍的成長記——追逐DBA1:奔波於路上挺進山東 藍的成長記——追逐DBA3:古董上操作資料匯入匯出成了問題 藍的成長記——追逐DBA8:重拾SP報告回憶oracle的STATSPACK實驗 藍的成長記— —追逐DBA(9):國慶漸去追逐DBA新規劃新啟程

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

爬取微信好友資訊進行視覺化分析(頭像人臉識別部分已更新!)程式碼已上傳

【Code】下載 1、專案說明 本次專案主要實現了以下功能: 2、微信好友資訊的獲取與檔案儲存 3、微信好友性別分析 4、微信好友地區分佈視覺化 5、微信好友個性簽名詞雲圖及好友備註詞雲圖 6、微信好

sql 刪除表中多餘的重複記錄欄位只保留一條記錄

在網上呢~自己收集了一些關於這方面的知識~  自己整理一下 1.查詢重複記錄 select * from 表名 where 重複欄位 in (select 重複欄位 from 表名 group

JS陣列方法 13操作方法陣列屬性 3屬性

一、陣列方法 shift() 陣列最前面刪除元素 unshift() 陣列最前面前新增元素 push() 陣列最後面新增元素 pop() 陣列最後面刪除元素 刪除某個陣列元素 delete arr[2]   concat()數組合並  array.co

plot圖畫多條折線圖如何把所有的折線都包含在圖中呢座標軸範圍如何設定

plot(himpact,axes=F) axis(1,at=c(0:23),labels=c(1:24));axis(2,at=c(0:100),labels=c(0:100)); lines(spline(x=c(0:23),y=himpact[,2]),col="blue"); lines(spli

類載入流程類載入機制及自定義類載入器詳解面試再也不怕了

一、引言二、類的載入、連結、初始化1、載入1.1、載入的class來源2、類的連結2.1、驗證2.2、準備2.3、解析3、類的初始化3.1、< clinit>方法相關3.2、類初始化時機3.3、final定義的初始化3.4、ClassLoader只會對類進行載入,不會進行初始化三、類載入器1、JV

使用webgl(three.js)搭建一個3D智慧園區、3D建築3D消防模擬web版3D,bim管理系統——第四課炫酷版一

這節課我們主要講解園區三維視覺化炫酷感官技術方案 前言:   當基礎技術達到普及狀態,應用就趨向於極致,在三維視覺化領域也是這個道理。各大視覺化公司都追求美觀最大化,這時候美工的作用就不容忽視了。   背景說明:     A、經濟背景:經濟下行的大環境下,各大有社會責任的企業與部門開始拉動內需,擴大預

月薪上萬卻依然不被世界所理解程式設計師訪談

點選上方關注我們,讓小care關愛你! 有一個“月入五萬卻像月入五千樣子”的群體,以“收入高”、“腦回路簡單”、“一成不變”等

根據阿里巴巴職位層級你的程式設計水平在什麼位置附等級詳細要求

目前並沒有對程式設計師等級進行明確的劃分,很多時候是參照BAT的程式設計師等級進行判定。 BAT(中國網際網路公司三巨頭) BAT,B指百度、A指阿里巴巴、T指騰訊,是中國網際網路公司百度公司(Baidu)、阿里巴巴集團(Alibaba)、騰訊公司(Tencent)三大網際網路公司首字母的縮寫。 先來一

DockPanel 3.0.4.0 支援.net 2.0 修改版 支援winform wpf包括vs2012 -vs2015 等多套面板

這是根據官方在github 18年5月份版本進行的修訂1. 修改使之可以在wpf 中正常使用,git上面的版本在wpf 上 拖拽會報異常2. 支援.net 2.0 包括面板附wpf 使用例子:1. 首先先新增引用 System.Windows.Forms 和 WindowsF

520魔都上海有一家的分手花店火火火了

報價單 情人節 靜安寺 上海 花店 5月20日,520諧音“我愛你”,這一天被情侶們當做了小情人節,紛紛在這一天選擇告白愛意。可是,在上海有一家花店卻釋放出了520終極“黑暗料理”。這家分手的位置非常好,愚園路102號,距離靜安寺、久光百貨等核心商圈不過幾十米。分手花店,光這店名就非常紮心

開通渲雲至尊會員送正版3DS MAX 2108這是要啊!

小編聽說,大家都用破解版的 3ds Max ,想問說,破解的用的還順手麽,有木有遇到軟件崩潰,系統紊亂,病毒侵入的問題,如果這些你都沒有遇到,那麽恭喜您,下一個就是你!俗話說,常在河邊走,哪有不濕鞋,所以,聰明人都選擇了正版,而且,盜版軟件已經完全破壞了正常的“生態環境”,越來越多的人對破解、盜版這個事

這手速了!編輯機器人分秒編輯人類編輯還有希望嗎?

人工智能編輯 編輯機器人 寫作機器人 資訊機器人 什麽是編輯機器人?編輯機器人就是通過AI技術來智能化提供文本的分類、分詞、關鍵詞提取等工作,極大提高文本處理效率。智能化的資訊頻道定制服務專家,無需人工編輯,資訊內容自動化生成。助力資訊運營“無人化編輯”,實現內容的7*24小時實時更新,是企業