博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
逆天通用水印扩展篇~新增剪贴板系列的功能和手动配置,卸除原基础不常用的功能...
阅读量:5856 次
发布时间:2019-06-19

本文共 13135 字,大约阅读时间需要 43 分钟。

常用技能:

逆天博客:

PSD源码:

 

通用水印V1.2 下载:

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

本次添加了一些新东西,比如剪贴板之类的水印操作。完善了部分功能(比如文件过滤,非Bitmap图片的处理,以及一些其他玩意等待你的发现)

先贴下新增的效果:

单个图片水印

多文件直接水印

 

网页图片批量转

word文档图片批量转

剪贴板图片水印

自动化配置

上篇重复的技术点我就不继续说了,这次主要贴一下剪贴板系列的code

using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Imaging;using System.IO;using System.Net;using System.Text;using System.Text.RegularExpressions;using System.Windows;namespace WaterMarkAPP.Common{    public class ClipboardHelper    {        ///         /// 获取剪贴板里的图片        ///         /// 
public static IEnumerable
GetImagePathList() { var imgPathList = new List
(); var data = Clipboard.GetDataObject(); var formats = data.GetFormats(); //二进制存储 (存储在剪贴板的截图|画画图内的图片) if (data.GetDataPresent(DataFormats.Dib, true)) { var imgSorce = Clipboard.GetImage(); Bitmap bmp = new Bitmap(imgSorce.PixelWidth, imgSorce.PixelHeight, PixelFormat.Format32bppPArgb); BitmapData bmpdata = bmp.LockBits(new Rectangle(System.Drawing.Point.Empty, bmp.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppPArgb); imgSorce.CopyPixels(Int32Rect.Empty, bmpdata.Scan0, bmpdata.Height * bmpdata.Stride, bmpdata.Stride); bmp.UnlockBits(bmpdata); CreateDirectory(); string filePath = string.Format(@"Images\{0}.png", Guid.NewGuid()); bmp.Save(filePath, ImageFormat.Png); imgPathList.Add(filePath); } //图片文件 if (data.GetDataPresent(DataFormats.FileDrop, true)) { string[] objs = (string[])data.GetData(DataFormats.FileDrop, true); if (objs != null) { for (int i = 0; i < objs.Length; i++) { imgPathList.Add(objs[i]); } } } //剪贴板内单文件 if (data.GetDataPresent(DataFormats.Bitmap, true)) { string filePath = SaveImg(data.GetData(DataFormats.Bitmap, true) as Bitmap); if (filePath != null) { imgPathList.Add(filePath); } } //HTML页面里面的图片(网页 + word) if (data.GetDataPresent(DataFormats.Html, true)) { var obj = data.GetData(DataFormats.Html, true); if (obj != null) { string dataStr = obj.ToString(); imgPathList.AddRange(DownloadImg(dataStr)); } } return imgPathList; } ///
/// 保存图片,返回图片地址 /// ///
///
private static string SaveImg(Bitmap bitmap) { if (bitmap == null) { return null; } CreateDirectory(); string filePath = string.Format(@"Images\{0}.png", Guid.NewGuid()); try { bitmap.Save(filePath, ImageFormat.Png); return filePath; } catch (Exception ex) { DNTLog(ex); return null; } } ///
/// 批量下载图片 /// ///
页面字符串 ///
成功条数 ///
private static IEnumerable
DownloadImg(string dataStr) { var imgPathList = new List
(); var collection = Regex.Matches(dataStr, @"
]*)\s*src=('|\"")([^'\""]+)('|\"")", RegexOptions.ECMAScript); WebClient webClient = new WebClient(); foreach (Match item in collection) { string imgPath = item.Groups[3].Value; try { CreateDirectory(); string filePath = string.Format(@"Images\{0}", Path.GetFileName(imgPath)); webClient.DownloadFile(item.Groups[3].Value, filePath);//剪贴板的图片没有相对路径 imgPathList.Add(string.Format(@"{0}\{1}", Directory.GetCurrentDirectory(), filePath)); } catch (Exception ex) { DNTLog(ex); } } return imgPathList; } private static void DNTLog(Exception ex) { File.WriteAllText("log.dnt", ex.ToString(), Encoding.UTF8); } ///
/// 创建文件夹 /// private static void CreateDirectory() { if (!Directory.Exists("Images")) { Directory.CreateDirectory("Images"); } } }}

水印帮助类注意点

using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;using System.Text;using WaterMarkAPP.Enums;using WaterMarkAPP.Model;namespace WaterMarkAPP.Common{    ///     /// 水印帮助类    ///     public class WaterMarkHelper    {        public static bool TryFromFile(string imgPath, ref Image img)        {            try            {                img = Image.FromFile(imgPath);                return true;            }            catch            {                return false;            }        }        #region 设置水印        ///         /// 设置水印        ///         ///         ///         /// 
public static Image SetWaterMark(string imgPath, WaterMark model) { Image imgSource = null;//背景图 Image markImg = null;//水印图片 if (!TryFromFile(imgPath, ref imgSource)) { return null; } //水印检验(文字,图片[路径下是否存在图片]) #region 水印校验+水印处理 if (model == null) { return null; } if (!System.IO.File.Exists(imgPath)) { return null; }//看看原图是否存在 //根据水印类型校验+水印处理 switch (model.WaterMarkType) { case WaterMarkTypeEnum.Text: if (string.IsNullOrEmpty(model.Text)) { return null; } else { markImg = TextToImager(model);//水印处理-如果是文字就转换成图片 } break; case WaterMarkTypeEnum.Image: if (!System.IO.File.Exists(model.ImgPath)) { return null; } else { if (!TryFromFile(model.ImgPath, ref markImg))//获得水印图像 { return imgSource; } } break; case 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 水印处理-文字转图片 /// /// 水印处理-文字转图片 /// /// ///
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 水印位置 /// /// 水印位置 /// /// /// /// /// /// 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 缩放水印 /// /// 等比缩放水印图(缩小到原图的1/3) /// /// /// ///
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 }}

 

源码参考:

转载地址:http://dgojx.baihongyu.com/

你可能感兴趣的文章
宇宙沸腾SCCM 2012 R2系列(2)安装SQL Server,扩展AD架构
查看>>
第十二章 LNMP架构
查看>>
安装如Epson LQ-300K等老式打印机方法和心得
查看>>
sed显示行数
查看>>
lync 客户端通讯录更新脚本
查看>>
Hibernate之QBC持久层封装(一)
查看>>
我的友情链接
查看>>
mysql+heartbeat+DRBD+LVS实现mysql高可用<二>
查看>>
EMC VNX系列技术存储介绍之1--几个重要的基本概念
查看>>
20分钟教你学会熟练使用ansible
查看>>
我的自娱自乐的小习惯
查看>>
css中的:not选择的使用
查看>>
站点地图和SiteMapPath控件的使用
查看>>
Bootstrap优秀模板-ColorAdmin.4.3.0
查看>>
Java书籍经典Top10
查看>>
4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间
查看>>
13.4 mysql用户管理 13.5 常用sql语句 13.6 mysql数据库备份恢复
查看>>
监控系统资源加邮件提醒
查看>>
我的重构第三步
查看>>
洞悉物联网发展1000问之什么物联网技术会颠覆创新呢?
查看>>