逆天通用水印扩展篇~新增剪贴板系列的功能和手动配置,卸除原基础不常用的功能

常用技能: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");
            }
        }
    }
}

水印帮助类注意点

水印帮助类请看原文

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2016-04-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏浅探ARKit

ARKit中控制.dae动画的播放

4.用时间控制动画--CAAnimation 里的 timeOffset 控制开始时间 duration控制播放时间

7287
来自专栏菩提树下的杨过

.NET:Entity Framework 笔记

有二年没关注EF,今天无意试了下发现跟主流的Hibernate等ORM框架越来越接近了,先看下Entity类的定义: using System; using S...

2138
来自专栏菩提树下的杨过

ExtJs+WCF+LINQ实现分页Grid

上篇文章《用ExtJs+Linq+Wcf打造简单grid 》,这个网格控件不带分页,本文在上文的基础上添加分页功能,文中会着重介绍如何在用LINQ返回分页数据,...

3457
来自专栏xingoo, 一个梦想做发明家的程序员

MFC 随机矩形

问题描述:   简单地使用随即的尺寸和颜色不停的绘制一系列的图像。 一种古老的方式:   设置一个向窗口函数发送WM_TIMER消息的windows计时器。  ...

2045
来自专栏Golang语言社区

Go中的依赖注入

I have written a small utility package to handle dependency injection in Go (it'...

2354
来自专栏岑志军的专栏

ReactNative-ListView

1963
来自专栏hbbliyong

WPF里ItemsControl的分组实现 --listbox 实现分组

我们在用到ItemsControl时,有时会用到分组,如ListBox,ListView,DataGrid。WPF的ItemsControl可以实现分组,是依托...

921
来自专栏

Flex 上传文件,服务端.net

using System; using System.Data; using System.Configuration; using System.Collec...

641
来自专栏一“技”之长

iOS NSTimer 定时器用法总结 原

NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下:

641
来自专栏技术之路

wcf webHttpBinding Post 大数据量提交 ios c#客户端

一直在为安卓和苹果写服务,刚开始的时候全用的Get请求用url传所有的参数,由于url长度的限制大的数据量 无法传到服务器,提交图片什么的就更不用说了,后来用的...

22410

扫码关注云+社区