逆天通用水印扩展篇~新增剪贴板系列的功能和手动配置,卸除原基础不常用的功能
时间:2022-05-07
本文章向大家介绍逆天通用水印扩展篇~新增剪贴板系列的功能和手动配置,卸除原基础不常用的功能,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
常用技能:http://www.cnblogs.com/dunitian/p/4822808.html#skill
逆天博客:http://dnt.dkil.net
逆天通用水印支持Winform,WPF,Web,WP,Win10。支持位置选择(9个位置 ==》[X]):http://www.cnblogs.com/dunitian/p/4939369.html
本次添加了一些新东西,比如剪贴板之类的水印操作。完善了部分功能(比如文件过滤,非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
{
/// <summary>
/// 获取剪贴板里的图片
/// </summary>
/// <returns></returns>
public static IEnumerable<string> GetImagePathList()
{
var imgPathList = new List<string>();
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;
}
/// <summary>
/// 保存图片,返回图片地址
/// </summary>
/// <param name="bitmap"></param>
/// <returns></returns>
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; }
}
/// <summary>
/// 批量下载图片
/// </summary>
/// <param name="dataStr">页面字符串</param>
/// <param name="i">成功条数</param>
/// <returns></returns>
private static IEnumerable<string> DownloadImg(string dataStr)
{
var imgPathList = new List<string>();
var collection = Regex.Matches(dataStr, @"<img([^>]*)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);
}
/// <summary>
/// 创建文件夹
/// </summary>
private static void CreateDirectory()
{
if (!Directory.Exists("Images"))
{
Directory.CreateDirectory("Images");
}
}
}
}
水印帮助类注意点
水印帮助类请看原文
- 简单的客户机服务器投射模拟
- 使用gcc编译gdb调试
- 剑指OFFER之第一个只出现一次的字符(九度OJ1283)
- c++中类长度解析
- 剑指OFFER之丑数(九度OJ1214)
- 剑指OFFER之把数组排成最小的数(九度OJ1504)
- 剑指OFFER之从1到n中出现1的次数(九度OJ1373)
- 剑指OFFER之最大子向量和(连续子数组的最大和)(九度OJ1372)
- 剑指OFFER之最小的K个数(九度OJ1371)
- 剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)
- 如何成为一名10x的数据分析师?
- 肥料生产商全套三拼在手:拟融资1.47亿元
- 《外媒Cointelegraph专访Qtum量子链Jordan Earls》—浅谈目前Dapps的主要问题
- ASP .Net Core 2.0 修改默认端口
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP面向对象程序设计(OOP)之方法重写(override)操作示例
- Python3与fastdfs分布式文件系统如何实现交互
- PHP判断是否微信访问的方法示例
- Pytorch损失函数nn.NLLLoss2d()用法说明
- python实现学生成绩测评系统
- Python dict的常用方法示例代码
- Scrapy模拟登录赶集网的实现代码
- opencv 图像腐蚀和图像膨胀的实现
- PHP实现微信退款的方法示例
- 基于Python和C++实现删除链表的节点
- python让函数不返回结果的方法
- PHP微商城开源代码实例
- PHP小程序支付功能完整版【基于thinkPHP】
- CodeIgniter框架实现的整合Smarty引擎DEMO示例
- PHP微信支付功能示例