常用技能:http://www.cnblogs.com/dunitian/p/4822808.html#skill
逆天博客:http://dnt.dkil.net
逆天通用水印擴展篇~新增剪貼板系列的功能和手動配置,卸除原基礎不常用的功能:http://www.cnblogs.com/dunitian/p/5377097.html
好幾天沒上QQ了,今天上了個QQ,,額....額...貌似消息還挺多,沒及時回復的還請見諒~~剛好昨天無聊把水印這快封裝出來了,支持圖片水印,文字水印,索引圖水印和非索引圖水印,支持位置選擇(9個位置 ==》[X])。好吧不高興屁話了,軟件是WPF的(只滿足我的需求,如果有需要可以出第個二版本),水印核心代碼封裝了個Helper類(通用:支持Winform,WPF,Web,WP,Win10)軟件共享一下==>http://pan.baidu.com/s/1qWDwv4C 源碼看下面
水印類
/// <summary> /// 水印類(重要參數:原圖類型,水印類型,水印位置,圖片水印路徑,文字水印內容) /// </summary> public class WaterMark { #region 基礎屬性設置 private string _photoType; /// <summary> /// 原圖類型 /// </summary> public string PhotoType { get { return _photoType; } set { _photoType = value; } } private WaterMarkTypeEnum _waterMarkType = WaterMarkTypeEnum.NoneMark; /// <summary> /// 水印類型 /// </summary> public WaterMarkTypeEnum WaterMarkType { get { return _waterMarkType; } set { _waterMarkType = value; } } #endregion #region 水印效果設置 private WaterMarkLocationEnum _waterMarkLocation = WaterMarkLocationEnum.BottomRight; /// <summary> /// 水印位置 /// </summary> public WaterMarkLocationEnum WaterMarkLocation { get { return _waterMarkLocation; } set { _waterMarkLocation = value; } } private float _transparency = 0.7f; /// <summary> /// 水印透明度 /// </summary> public float Transparency { get { return _transparency; } set { _transparency = value; } } #endregion #region 圖片水印設置 private string _imgPath; /// <summary> /// 圖片水印路徑 /// </summary> public string ImgPath { get { return _imgPath; } set { _imgPath = value; } } #endregion #region 文字水印設置 private string _text = "dunitian"; /// <summary> /// 文字水印內容 /// </summary> public string Text { get { return _text; } set { _text = value; } } private string _fontFamily = "微軟雅黑"; /// <summary> /// 文字字體 /// </summary> public string FontFamily { get { return _fontFamily; } set { _fontFamily = value; } } private Brush _brushesColor = Brushes.Black; /// <summary> /// 文字顏色 /// </summary> public Brush BrushesColor { get { return _brushesColor; } set { _brushesColor = value; } } private FontStyle _fontStyle = FontStyle.Regular; /// <summary> /// 字體樣式 /// </summary> public FontStyle FontStyle { get { return _fontStyle; } set { _fontStyle = value; } } private float _fontSize = 14f; /// <summary> /// 字體大小 /// </summary> public float FontSize { get { return _fontSize; } set { _fontSize = value; } } #endregion }
水印位置枚舉
/// <summary> /// 水印位子 /// </summary> public enum WaterMarkLocationEnum { /// <summary> /// 頂部居左 /// </summary> TopLeft = 1, /// <summary> /// 頂部居中 /// </summary> TopCenter = 2, /// <summary> /// 頂部居右 /// </summary> TopRight = 3, /// <summary> /// 中部居左 /// </summary> CenterLeft = 4, /// <summary> /// 中部居中 /// </summary> CenterCenter = 5, /// <summary> /// 中部居右 /// </summary> CenterRight = 6, /// <summary> /// 底部居左 /// </summary> BottomLeft = 7, /// <summary> /// 底部居左 /// </summary> BottomCenter = 8, /// <summary> /// 底部居左 /// </summary> BottomRight = 9, }
水印類型枚舉
/// <summary> /// 水印類型 /// </summary> public enum WaterMarkTypeEnum { /// <summary> /// 文字 /// </summary> Text = 1, /// <summary> /// 圖片 /// </summary> Image = 2, /// <summary> /// 無水印 /// </summary> NoneMark = 3 }
水印幫助類(自己封裝的,有bug可以像我反饋)
/// <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 }
簡單調用:
文字水印調用:
/// <summary> /// 文字水印調用 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Click(object sender, RoutedEventArgs e) { //給水印對象賦對應的值 WaterMark waterMark = new WaterMark(); waterMark.WaterMarkType = Enums.WaterMarkTypeEnum.Text; waterMark.Transparency = 0.7f; waterMark.Text = "dunitian.cnblogs.com"; waterMark.FontStyle = System.Drawing.FontStyle.Bold; waterMark.FontFamily = "Consolas"; waterMark.FontSize = 20f; waterMark.BrushesColor = System.Drawing.Brushes.YellowGreen; waterMark.WaterMarkLocation = Enums.WaterMarkLocationEnum.CenterCenter; //調用 Image successImage = WaterMarkHelper.SetWaterMark("text.png", waterMark); //保存 successImage.Save("text1.png", System.Drawing.Imaging.ImageFormat.Png); MessageBox.Show("請查看軟件根目錄", "成功"); }
圖片水印調用:
/// <summary> /// 圖片水印調用 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Click_1(object sender, RoutedEventArgs e) { //給水印對象賦對應的值 WaterMark waterMark = new WaterMark(); waterMark.WaterMarkType = Enums.WaterMarkTypeEnum.Image; waterMark.ImgPath = "水印.png"; waterMark.WaterMarkLocation = Enums.WaterMarkLocationEnum.CenterCenter; waterMark.Transparency = 0.7f; //調用 Image successImage = WaterMarkHelper.SetWaterMark("text.png", waterMark); //保存 successImage.Save("text2.png", System.Drawing.Imaging.ImageFormat.Png); MessageBox.Show("請查看軟件根目錄","成功"); }
軟件源碼:(helper類不是最新,用上文的helper類)
(調用部分我做了一個通用apidemo)==>http://pan.baidu.com/s/1gd1300z
namespace WaterMarkAPP { /// <summary> /// MainWindow.xaml 的交互邏輯 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } #region 按鈕事件 /// <summary> /// 單文水印 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnFont_Click(object sender, RoutedEventArgs e) { WaterMark waterMark = WaterMarkFont(); DIVWaterMark(waterMark); } /// <summary> /// 批文水印 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnFonts_Click(object sender, RoutedEventArgs e) { WaterMark waterMark = WaterMarkFont(); DIVWaterMarks(waterMark); } /// <summary> /// 單圖水印 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnImage_Click(object sender, RoutedEventArgs e) { WaterMark waterMark = WaterMarkImage(); DIVWaterMark(waterMark); } /// <summary> /// 批圖水印 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnImages_Click(object sender, RoutedEventArgs e) { WaterMark waterMark = WaterMarkImage(); DIVWaterMarks(waterMark); } #endregion #region 關閉程序 /// <summary> /// 關閉程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Click(object sender, RoutedEventArgs e) { Environment.Exit(0); } #endregion #region 窗體拖動 /// <summary> /// 窗體拖動 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DragWindow(object sender, MouseButtonEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { DragMove(); } } #endregion #region 版權系列 private void TextBlock_MouseLeave(object sender, MouseEventArgs e) { Process.Start("http://dunitian.cnblogs.com/"); } private void TextBlock_MouseLeave_1(object sender, MouseEventArgs e) { Process.Start("http://tieba.baidu.com/f?kw=毒逆天"); } private void TextBlock_MouseLeave_2(object sender, MouseEventArgs e) { Process.Start("http://1054186320.qzone.qq.com/"); } #endregion #region 軟件代碼(水印核心代碼請看Helper類,最簡潔的調用請看APIDemo文件夾里面的內容) #region 水印預設 /// <summary> /// 水印文字預設 /// </summary> /// <returns></returns> private static WaterMark WaterMarkFont() { WaterMark waterMark = new WaterMark(); waterMark.WaterMarkType = Enums.WaterMarkTypeEnum.Text; waterMark.Transparency = 0.7f; waterMark.Text = "dunitian.cnblogs.com"; waterMark.FontStyle = System.Drawing.FontStyle.Bold; waterMark.FontFamily = "Consolas"; waterMark.FontSize = 20f; waterMark.BrushesColor = System.Drawing.Brushes.YellowGreen; waterMark.WaterMarkLocation = Enums.WaterMarkLocationEnum.CenterCenter; return waterMark; } /// <summary> /// 圖片水印預設 /// </summary> /// <returns></returns> private static WaterMark WaterMarkImage() { WaterMark waterMark = new WaterMark(); waterMark.WaterMarkType = Enums.WaterMarkTypeEnum.Image; waterMark.ImgPath = "水印.png"; waterMark.WaterMarkLocation = Enums.WaterMarkLocationEnum.BottomRight; waterMark.Transparency = 0.7f; return waterMark; } #endregion #region 水印操作 /// <summary> /// 單個水印操作 /// </summary> /// <param name="waterMark"></param> private static void DIVWaterMark(WaterMark waterMark) { #region 必須參數獲取 OpenFileDialog dialog = new OpenFileDialog { Filter = "png(*.png)|*.png|jpg(*.jpg)|*.jpg|bmp(*.bmp)|*.bmp|gif(*.gif)|*.gif|jpeg(*.jpeg)|*.jpeg", Title = "打開一張圖片" }; if (dialog.ShowDialog() != true) { return; } //圖片路徑 string filePath = dialog.FileName; //文件名 string fileName = System.IO.Path.GetFileNameWithoutExtension(filePath); //圖片所處目錄 string dirPath = System.IO.Path.GetDirectoryName(filePath); //存放目錄 string savePath = dirPath + "\\DNTWaterMark"; //是否存在,不存在就創建 if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } #endregion #region 水印操作 Image successImage = WaterMarkHelper.SetWaterMark(filePath, waterMark); if (successImage != null) { //保存圖片(不管打不打開都保存) successImage.Save(savePath + "\\" + fileName + ".png", System.Drawing.Imaging.ImageFormat.Png); //是否打開目錄 MessageBoxResult result = MessageBox.Show("水印成功!是否打開目錄?", "逆天友情提醒", MessageBoxButton.YesNo); if (result == MessageBoxResult.Yes) { System.Diagnostics.Process.Start("explorer.exe ", savePath);//打開保存后的路徑 } } else { MessageBox.Show("水印失敗!請檢查原圖和水印圖!", "逆天友情提醒"); } #endregion } /// <summary> /// 批量水印操作 /// </summary> /// <param name="waterMark"></param> private void DIVWaterMarks(WaterMark waterMark) { System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog { Description = "選擇你要批量水印的圖片目錄" }; if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { string[] files = Directory.GetFiles(dialog.SelectedPath); if (files.Length <= 0) { return; } #region 存儲專用 //圖片所處目錄 string dirPath = System.IO.Path.GetDirectoryName(files[0]); //存放目錄 string savePath = dirPath + "\\DNTWaterMark"; //是否存在,不存在就創建 if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } #endregion int num = 0;//計數用 foreach (string filePath in files) { //文件名 string fileName = System.IO.Path.GetFileNameWithoutExtension(filePath); Image successImage = WaterMarkHelper.SetWaterMark(filePath, waterMark); if (successImage != null) { //保存圖片 successImage.Save(savePath + "\\" + fileName + ".png", System.Drawing.Imaging.ImageFormat.Png); num++; } } //是否打開目錄 MessageBoxResult result = MessageBox.Show("逆天友情提醒:已轉換 " + num + " 張圖片~是否打開目錄?", "轉換狀態", MessageBoxButton.YesNo); if (result == MessageBoxResult.Yes) { System.Diagnostics.Process.Start("explorer.exe ", savePath);//打開保存后的路徑 } } } #endregion #endregion } }
<Window x:Class="WaterMarkAPP.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="水印工具" Height="545" Width="298" Background="Transparent" AllowsTransparency="True" WindowStyle="None" WindowStartupLocation="CenterScreen" MouseLeftButtonDown="DragWindow" Icon="1.ico"> <!--快樂玩耍:DIV一個手機--> <!--手機整體--> <Border BorderBrush="Green" Background="Black" BorderThickness="4" CornerRadius="10,10,10,10"> <Grid> <!--主屏幕--> <Border BorderBrush="Gray" BorderThickness="2" Margin="10,50,10,40"> <Grid Background="#FF151515"> <Grid.RowDefinitions> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> </Grid.RowDefinitions> <TextBlock FontFamily="微軟雅黑">對不起,系統已掛請聯系逆天重裝Win10!</TextBlock> <Button Grid.Row="1" Opacity="0.6" HorizontalAlignment="Center" VerticalAlignment="Center" Height="50" Width="100" Click="BtnFont_Click">單文水印</Button> <Button Grid.Row="2" Opacity="0.6" HorizontalAlignment="Center" VerticalAlignment="Center" Height="50" Width="100" Click="BtnImage_Click">單圖水印</Button> <Button Grid.Row="3" Opacity="0.6" HorizontalAlignment="Center" VerticalAlignment="Center" Height="50" Width="100" Click="BtnFonts_Click">批文水印</Button> <Button Grid.Row="4" Opacity="0.6" HorizontalAlignment="Center" VerticalAlignment="Center" Height="50" Width="100" Click="BtnImages_Click">批圖水印</Button> <Button Grid.Row="5" Opacity="0.6" HorizontalAlignment="Center" VerticalAlignment="Center" Height="50" Width="100" Click="Button_Click">關閉程序</Button> </Grid> </Border> <!--底部--> <Border BorderBrush="Black" BorderThickness="2" CornerRadius="0,0,10,10" VerticalAlignment="Bottom" Height="40"> <!--底部按鍵--> <Grid> <TextBlock Text="毒" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="80,0,0,0" Width="20" Foreground="Gray" MouseLeave="TextBlock_MouseLeave" /> <TextBlock Text="逆" HorizontalAlignment="Center" VerticalAlignment="Center" Width="20" Foreground="Gray" MouseLeave="TextBlock_MouseLeave_1"/> <TextBlock Text="天" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,80,0" Width="20" Foreground="Gray" MouseLeave="TextBlock_MouseLeave_2"/> </Grid> </Border> </Grid> </Border> </Window>
效果:
V1.0源碼下載:http://pan.baidu.com/s/1gd1300z
最新源碼:https://github.com/dunitian/DNTLive/tree/master/Software/WaterMarkAPP