.net为图片添加水印(转) jpg png和gif格式
.net为图片添加水印(转) jpg png和gif格式
.net为图片添加水印(转) jpg png和gif格式,转自csdn的hyde82,现在跟大家一起来分享下:
利 用.net中System.Drawing命名空间下的常用类我们就可以轻松的为图片添加文字水印和图片水印,并且可以自定义水印文字和水印图片的大小、 位置、颜色、透明度等等!对于jpg或者png等图片,可以直接通过Graphics g= Graphics.FromImage(image)来获得Graphics对象,但对于gif图片,通过这种方法无法获得Graphics对象,解决这 个问题的方法是首先根据.gif文件的大小生成一个位图作图区,然后将原图复制到作图区,做进行处理,以下是水印添加类的完整代码:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Drawing.Drawing2D;
namespace JillZhang
{
/**//// <summary>
/// 给图片添加水印得类得描述
/// </summary>
public class WaterMark
{
private bool _textMark=false;
private bool _imgMark=false;
private string _text="";
private string _imgPath="";
private int _markX=0;
private int _markY=0;
private float _transparency=1;
private string _fontFamily="宋体";
private Color _textColor=Color.Black;
private bool _textbold=false;
int[] sizes=new int[]{48,32,16,8,6,4};
/**//// <summary>
/// 实例化一个水印类
/// </summary>
public WaterMark()
{
}
/**//// <summary>
/// 初始化一个只添加文字水印得实例
/// </summary>
/// <param name="text">水印文字</param>
/// <param name="fontFamily">文字字体</param>
/// <param name="bold">是否粗体</param>
/// <param name="color">字体颜色</param>
/// <param name="markX">标记位置横坐标</param>
/// <param name="markY">标记位置纵坐标</param>
public WaterMark(string text,string fontFamily,bool bold,Color color,int markX,int markY)
{
this._imgMark=false;
this._textMark=true;
this._text=text;
this._fontFamily=fontFamily;
this._textbold=bold;
this._textColor=color;
this._markX=markX;
this._markY=MarkY;
}
/**//// <summary>
/// 实例化一个只添加图片水印得实例
/// </summary>
/// <param name="imagePath">水印图片路径</param>
/// <param name="tranparence">透明度</param>
/// <param name="markX">标记位置横坐标</param>
/// <param name="markY">标记位置纵坐标</param>
public WaterMark(string imagePath,float tranparence,int markX,int markY)
{
this._textMark=false;
this._imgMark=true;
this._imgPath=imagePath;
this._markX=markX;
this._markY=MarkY;
this._transparency=tranparence;
}
/**//// <summary>
/// 是否添加文字水印
/// </summary>
public bool TextMark
{
get{return _textMark;}
set{_textMark=value;}
}
/**//// <summary>
/// 是否添加图片水印
/// </summary>
public bool ImageMark
{
get{return _imgMark;}
set{_imgMark=value;}
}
/**//// <summary>
/// 文字水印得内容
/// </summary>
public string Text
{
get{return _text;}
set{_text=value;}
}
/**//// <summary>
/// 图片水印得图片地址
/// </summary>
public string ImagePath
{
get{return _imgPath;}
set{_imgPath=value;}
}
/**//// <summary>
/// 添加水印位置得横坐标
/// </summary>
public int MarkX
{
get{return _markX;}
set{_markX=value;}
}
/**//// <summary>
/// 添加水印位置得纵坐标
/// </summary>
public int MarkY
{
get{return _markY;}
set{_markY=value;}
}
/**//// <summary>
/// 水印得透明度
/// </summary>
public float Transparency
{
get{
if(_transparency>1.0f)
{
_transparency=1.0f;
}
return _transparency;}
set{_transparency=value;}
}
/**//// <summary>
/// 水印文字得颜色
/// </summary>
public Color TextColor
{
get{return _textColor;}
set{_textColor=value;}
}
/**//// <summary>
/// 水印文字得字体
/// </summary>
public string TextFontFamily
{
get{return _fontFamily;}
set{_fontFamily=value;}
}
/**//// <summary>
/// 水印文字是否加粗
/// </summary>
public bool Bold
{
get{return _textbold;}
set{_textbold=value;}
}
/**//// <summary>
/// 添加水印,此方法适用于gif格式得图片
/// </summary>
/// <param name="image">需要添加水印得图片</param>
/// <returns>添加水印之后得图片</returns>
public Image Mark(Image img)
{
try
{
//添加文字水印
if(this.TextMark)
{
//根据源图片生成新的Bitmap对象作为作图区,为了给gif图片添加水印,才有此周折
Bitmap newBitmap=new Bitmap(img.Width,img.Height,PixelFormat.Format24bppRgb);
//设置新建位图得分辨率
newBitmap.SetResolution(img.HorizontalResolution,img.VerticalResolution);
//创建Graphics对象,以对该位图进行操作
Graphics g = Graphics.FromImage(newBitmap);
//消除锯齿
g.SmoothingMode=SmoothingMode.AntiAlias;
//将原图拷贝到作图区
g.DrawImage(img,new Rectangle(0,0,img.Width,img.Height),0,0,img.Width,img.Height,GraphicsUnit.Pixel);
//声明字体对象
Font cFont = null;
//用来测试水印文本长度得尺子
SizeF size=new SizeF();
//探测出一个适合图片大小得字体大小,以适应水印文字大小得自适应
for(int i=0;i<6;i++)
{
//创建一个字体对象
cFont= new Font(this.TextFontFamily,sizes[i]);
//是否加粗
if(!this.Bold)
{
cFont= new Font(this.TextFontFamily,sizes[i],FontStyle.Regular);
}
else
{
cFont=new Font(this.TextFontFamily,sizes[i],FontStyle.Bold);
}
//测量文本大小
size=g.MeasureString(this.Text,cFont);
//匹配第一个符合要求得字体大小
if((ushort)size.Width<(ushort)img.Width)
{
break;
}
}
//创建刷子对象,准备给图片写上文字
Brush brush= new SolidBrush(this.TextColor);
//在指定得位置写上文字
g.DrawString(this.Text,cFont,brush,this.MarkX,this.MarkY);
//释放Graphics对象
g.Dispose();
//将生成得图片读入MemoryStream
System.IO.MemoryStream ms = new System.IO.MemoryStream();
newBitmap.Save(ms,ImageFormat.Jpeg);
//重新生成Image对象
img=System.Drawing.Image.FromStream(ms);
//返回新的Image对象
return img;
}
//添加图像水印
if(this.ImageMark)
{
//获得水印图像
Image markImg = Image.FromFile(this.ImagePath);
//创建颜色矩阵
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, this.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);
//生成位图作图区
Bitmap newBitmap=new Bitmap(img.Width,img.Height,PixelFormat.Format24bppRgb);
//设置分辨率
newBitmap.SetResolution(img.HorizontalResolution,img.VerticalResolution);
//创建Graphics
Graphics g = Graphics.FromImage(newBitmap);
//消除锯齿
g.SmoothingMode=SmoothingMode.AntiAlias;
//拷贝原图到作图区
g.DrawImage(img,new Rectangle(0,0,img.Width,img.Height),0,0,img.Width,img.Height,GraphicsUnit.Pixel);
//如果原图过小
if(markImg.Width>img.Width||markImg.Height>img.Height)
{
System.Drawing.Image.GetThumbnailImageAbort callb=null;
//对水印图片生成缩略图,缩小到原图得1/4
System.Drawing.Image
new_img=markImg.GetThumbnailImage(img.Width/4,markImg.Height*img.Width/markImg.Width,callb,new
System.IntPtr());
//添加水印
g.DrawImage(new_img,new
Rectangle(this.MarkX,this.MarkY,new_img.Width,new_img.Height),0,0,new_img.Width,new_img.Height,GraphicsUnit.Pixel,imageAttributes);
//释放缩略图
new_img.Dispose();
//释放Graphics
g.Dispose();
//将生成得图片读入MemoryStream
System.IO.MemoryStream ms = new System.IO.MemoryStream();
newBitmap.Save(ms,ImageFormat.Jpeg);
//返回新的Image对象
img=Image.FromStream(ms);
return img;
}
//原图足够大
else
{
//添加水印
g.DrawImage(markImg,new
Rectangle(this.MarkX,this.MarkY,markImg.Width,markImg.Height),0,0,markImg.Width,markImg.Height,GraphicsUnit.Pixel,imageAttributes);
//释放Graphics
g.Dispose();
//将生成得图片读入MemoryStream
System.IO.MemoryStream ms = new System.IO.MemoryStream();
newBitmap.Save(ms,ImageFormat.Jpeg);
//返回新的Image对象
img=Image.FromStream(ms);
return img;
}
}
return img;
}
catch
{
return img;
}
}
}
}
通过该类,您可以轻松的对图片加水印,但也有不足,通过这种方法添加水印,会破坏.gif动画,因为我目前还不知道如何判断.gif文件是否是动画,这个问题还需要各位网友的建议和帮助
jacklean判断帧数(非动画只有和帧)然后逐帧加水印,然后合成新的动画,因为GIF加载到Bitmap中清淅度会变差,所以还要用OctreeQuantizer组件插值能改善一些
使用示例:
//测试添加文字水印(不可调透明)
private void test()
{
JillZhang.WaterMark wm = new JillZhang.WaterMark();
wm.MarkX = 10;
wm.MarkY = 10;
wm.Text = "TEST flash";
wm.TextFontFamily = "微软雅黑";
wm.TextColor = System.Drawing.Color.Orange;
wm.TextMark = true;
wm.Bold = true;
System.Drawing.Image img = System.Drawing.Image.FromFile("E:\\Work\\test\\WebSite1\\flashh.jpg");
img = wm.Mark(img);
img.Save(Server.MapPath("pic\\") + "tt4" + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
.net为图片添加水印(转) jpg png和gif格式的更多相关文章
- Android 图片添加水印图片或者文字
给图片添加水印的基本思路都是载入原图,添加文字或者载入水印图片,保存图片这三个部分 添加水印图片: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
- java实现给图片添加水印
package michael.io.image; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.aw ...
- java.imageIo给图片添加水印
最近项目在做一个商城项目, 项目上的图片要添加水印①,添加图片水印;②:添加文字水印; 一下提供下个方法,希望大家可以用得着: package com.blogs.image; import java ...
- ASP.NET -- WebForm -- 给图片添加水印标记
ASP.NET -- WebForm: 给图片添加水印标记 ASP.NET:使用 WebForm(C#) 制作一个简单的为图片添加水印的页面. 1. Test2.aspx文件 <%@ Page ...
- JAVA给图片添加水印
package com.test; import org.junit.Test; import javax.imageio.ImageIO; import java.awt.*; import jav ...
- 【Python】给图片添加水印的Python及Golang实现
前言 不知道大家有没有这样的习惯,一篇比较得意的博客在发表一段时间之后会特别关注,前段时间一篇写到凌晨的博客被 码迷 这个网关爬取之后发表了,因为搜索引擎先爬取码迷的,所以我的博客无法被搜索到,即使直 ...
- iOS边练边学--(Quartz2D)图片添加水印
一.给图片添加水印的基本步骤 加载图片 手动创建位图上下文 绘制原生的图片 给原生的图片添加文字 生成一张图片给我们,从上下文中获取图片 关闭上下文 二.注意:位图上下文的获取方式跟layer上下文不 ...
- int.TryParse非预期执行引发的思考 ASP.NET -- WebForm -- 给图片添加水印标记 Windows -- 使用批处理文件.bat删除旧文件
int.TryParse非预期执行引发的思考 问题出现 这天在写一个页面,想谨慎些就用了int.TryParse,结果出问题了. 代码如下: Copy int id = 1000; //Reque ...
- 海报工厂之(一)android 如何给图片添加水印和文字
在Android中如何给图片添加水印,下面截取了部分核心代码,仅供参考: /** * 获取图片缩小的图片 * @param src * @return */ ...
随机推荐
- PostMan 使用Interceptor 发送带cookie的请求一直loading
问题 最近要写一个爬虫(虽然是第一次写),于是就用了Chrome上非常方便一个插件,PostMan,但是由于chrome安全的限制,发不出带cookie和带有自定义头部标签的请求. 百度一番后得如果想 ...
- Linux命令详解-文件系统管理
1. 外部设备简介 (1.)硬盘的分类: IDE硬盘 ./dev/hda hdb,hdc… 分区后:/dev/hda1 /dev/hda2 scsi硬盘: /dev/sda sdb,sdc ...
- 第13章 TCP编程(3)_基于自定义协议的多进程模型
5. 自定义协议编程 (1)自定义协议:MSG //自定义的协议(TLV:Type length Value) typedef struct{ //协议头部 ];//TLV中的T unsigned i ...
- 10-19 dp专练
dp专练,终于克服了一次自己对dp的恐惧,磕出来一道题. 得分情况: T1:0 T2:0 T3:0 emmmm,磕出来的题是T2,但是因为初始化和int long long的原因爆零了 T1:n只狼排 ...
- 解决php7.1的中遇到的问题
在php7.1中部署微擎遇到问题 1.mysql_xxx函数不支持,修改install.php为mysqli的写法 2.session读取失败,不是php.ini设置的问题,应该是php7.1的bug ...
- centos7的web环境安装配置
1.安装基本东西安装apache yum install httpd安装mariadb yum install mariadb mariadb-server安装php yum install p ...
- 数据结构之线索二叉树——C语言实现
线索二叉树操作 (1) 线索二叉树的表示:将每个节点中为空的做指针与右指针分别用于指针节点的前驱和后续,即可得到线索二叉树. (2) 分类:先序线索二叉树,中序线索二叉树,后续线索二叉树 (3) 增 ...
- Amazon AWS S3 操作手册
Install the SDK The recommended way to use the AWS SDK for Java in your project is to consume it fro ...
- jpa-入门级测试
- HTML5拖动
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...