逆天通用水印支持Winform,WPF,Web,WP,Win10。支持位置选择(9个位置==》[X])

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

好几天没上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>

效果:

源码下载:http://pan.baidu.com/s/1gd1300z

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航