常用技能: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

