说明:生成水印,可按左上、左下、右上、右下、居中、透明度生成文件,只对jpeg或jpg格式有效!
作者:Blue.Dream
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
namespace test
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
//声明加密字符生成的随机数的位数
public const int LENGTH = 32;
//声明加密字符前后的分隔长度
public const int LEN = 4;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Button btn_Browser;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.PictureBox imgSource;
private System.Windows.Forms.PictureBox imgObject;
private System.Windows.Forms.PictureBox imgWater;
private System.Windows.Forms.Button btn_Water;
private string SourceFile;
private string WaterFile;
private string SaveFile;
private System.Windows.Forms.TextBox alpha;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.ComboBox local;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
this.Init();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
private void Init()
{
DataTable ht = new DataTable();
DataColumn objcol = new DataColumn("Keys");
objcol.DataType = typeof(System.String);
ht.Columns.Add(objcol);
objcol = new DataColumn("Value");
objcol.DataType = typeof(System.Int32);
ht.Columns.Add(objcol);
DataRow row = ht.NewRow();
row[0] = "左上";
row[1] = 1;
ht.Rows.Add(row);
row = ht.NewRow();
row[0] = "左下";
row[1] = 2;
ht.Rows.Add(row);
row = ht.NewRow();
row[0] = "右上";
row[1] = 3;
ht.Rows.Add(row);
row = ht.NewRow();
row[0] = "右下";
row[1] = 4;
ht.Rows.Add(row);
row = ht.NewRow();
row[0] = "居中";
row[1] = 5;
ht.Rows.Add(row);
this.local.DataSource = ht;
this.local.DisplayMember = "Keys";
this.local.ValueMember = "Value";
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.btn_Browser = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.imgSource = new System.Windows.Forms.PictureBox();
this.imgObject = new System.Windows.Forms.PictureBox();
this.imgWater = new System.Windows.Forms.PictureBox();
this.btn_Water = new System.Windows.Forms.Button();
this.local = new System.Windows.Forms.ComboBox();
this.alpha = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox3.SuspendLayout();
this.SuspendLayout();
//
// groupBox1
//
this.groupBox1.Controls.AddRange(new System.Windows.Forms.Control[] {
this.imgSource});
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(288, 152);
this.groupBox1.TabIndex = 0;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "源图";
//
// groupBox2
//
this.groupBox2.Controls.AddRange(new System.Windows.Forms.Control[] {
this.imgObject});
this.groupBox2.Location = new System.Drawing.Point(304, 0);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(352, 296);
this.groupBox2.TabIndex = 0;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "结果图";
//
// btn_Browser
//
this.btn_Browser.Location = new System.Drawing.Point(24, 312);
this.btn_Browser.Name = "btn_Browser";
this.btn_Browser.TabIndex = 1;
this.btn_Browser.Text = "源 图";
this.btn_Browser.Click += new System.EventHandler(this.btn_Browser_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(552, 312);
this.button2.Name = "button2";
this.button2.TabIndex = 2;
this.button2.Text = "生 成";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// imgSource
//
this.imgSource.Location = new System.Drawing.Point(8, 16);
this.imgSource.Name = "imgSource";
this.imgSource.Size = new System.Drawing.Size(272, 128);
this.imgSource.TabIndex = 0;
this.imgSource.TabStop = false;
//
// imgObject
//
this.imgObject.Location = new System.Drawing.Point(8, 16);
this.imgObject.Name = "imgObject";
this.imgObject.Size = new System.Drawing.Size(336, 272);
this.imgObject.TabIndex = 0;
this.imgObject.TabStop = false;
//
// imgWater
//
this.imgWater.Location = new System.Drawing.Point(8, 16);
this.imgWater.Name = "imgWater";
this.imgWater.Size = new System.Drawing.Size(272, 120);
this.imgWater.TabIndex = 1;
this.imgWater.TabStop = false;
//
// btn_Water
//
this.btn_Water.Location = new System.Drawing.Point(120, 312);
this.btn_Water.Name = "btn_Water";
this.btn_Water.TabIndex = 3;
this.btn_Water.Text = "水印图";
this.btn_Water.Click += new System.EventHandler(this.btn_Water_Click);
//
// local
//
this.local.Location = new System.Drawing.Point(256, 312);
this.local.Name = "local";
this.local.Size = new System.Drawing.Size(112, 20);
this.local.TabIndex = 4;
this.local.Text = "--请选择--";
//
// alpha
//
this.alpha.Location = new System.Drawing.Point(448, 312);
this.alpha.Name = "alpha";
this.alpha.Size = new System.Drawing.Size(72, 21);
this.alpha.TabIndex = 5;
this.alpha.Text = "";
//
// label1
//
this.label1.Location = new System.Drawing.Point(216, 312);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(32, 23);
this.label1.TabIndex = 6;
this.label1.Text = "位置";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// label2
//
this.label2.Location = new System.Drawing.Point(392, 312);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(48, 23);
this.label2.TabIndex = 6;
this.label2.Text = "透明度";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// groupBox3
//
this.groupBox3.Controls.AddRange(new System.Windows.Forms.Control[] {
this.imgWater});
this.groupBox3.Location = new System.Drawing.Point(0, 160);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(288, 136);
this.groupBox3.TabIndex = 7;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "水印图";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(664, 365);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.groupBox3,
this.label1,
this.alpha,
this.local,
this.btn_Water,
this.button2,
this.btn_Browser,
this.groupBox1,
this.groupBox2,
this.label2});
this.Name = "Form1";
this.Text = "Form1";
this.groupBox1.ResumeLayout(false);
this.groupBox2.ResumeLayout(false);
this.groupBox3.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void btn_Browser_Click(object sender, System.EventArgs e)
{
using(OpenFileDialog dlg = new OpenFileDialog())
{
if(dlg.ShowDialog() == DialogResult.OK)
{
string file = dlg.FileName;
if(File.Exists(file))
{
this.SourceFile = file;
imgSource.Image = new Bitmap(file);
}
}
dlg.Dispose();
}
}
private void button2_Click(object sender, System.EventArgs e)
{
string wf = @"E:\Test.jpg";
this.SaveFile = wf;
int local = (int)(this.local.SelectedValue);
int al = 80;
try
{
al = Int32.Parse(this.alpha.Text.Trim());
}
catch
{
}
if(MakeWaterImage(this.SourceFile,this.WaterFile,this.SaveFile,local,al))
{
this.imgObject.Image = new Bitmap(this.SaveFile);
}
}
/// <summary>
/// 生成水印,可按左上、左下、右上、右下、居中、透明度生成文件,只对jpeg或jpg格式有效!
/// </summary>
/// <param name="sourceFile">底图</param>
/// <param name="waterMarkFile">水印图</param>
/// <param name="saveFile">要保存的文件</param>
/// <param name="local">位置:左上(1)、左下(2)、右上(3)、右下(4)、居中(5)</param>
/// <param name="alpha">透明度(1-100)</param>
/// <returns>bool,是否成功</returns>
public static bool MakeWaterImage(string sourceFile,string waterMarkFile,string saveFile,int local,int alpha)
{
bool result;
if( !File.Exists(sourceFile) || !File.Exists(waterMarkFile)) //如果源图或水印图不存在
return false;
FileInfo fi = new FileInfo(sourceFile);
//判断文件类型是否合法
if(fi.Extension.ToLower()!=".jpg" & fi.Extension.ToLower()!=".jpeg")
return false;
try
{
//原图
Bitmap sImage = new Bitmap(sourceFile);
int sWidth = sImage.Width;
int sHeight = sImage.Height;
//水印图
Bitmap wImage = new Bitmap(waterMarkFile);
int wWidth = wImage.Width;
int wHeight = wImage.Height;
//make Graphics.
Graphics g = Graphics.FromImage(sImage);
int x; //临时变量
int y; //监时变量
int x1 = 0; //原图和水印图的宽度差,即开始绘图的X位置
int y1 = 0; //原图和水印图的高度差,即开始绘图的Y位置
int w = 0; //生成的水印图的宽度,即结束绘图的X位置
int h = 0; //生成的水印图的高度,即结束绘图的Y位置
int al; //alpha
int rl; //Red
int gl; //Green
int bl; //Blue
//校验透明度
if(alpha < 1 || alpha > 100)
al = 80;
else
al = alpha;
if(sWidth > wWidth & sHeight > wHeight) //如果源图比水印图大
{
switch(local)
{
case 1: //左上
x1 = 0;
y1 = 0;
break;
case 2: //左下
x1 = 0;
if( (sHeight-wHeight) > 0 ) //源图比水印图高
y1 = sHeight - wHeight;
else
y1 = sWidth;
break;
case 3: //右上
y1 = 0;
if( (sWidth - wWidth) > 0) // 源图比水印图宽
x1 = sWidth - wWidth;
else
x1 = sWidth;
break;
case 4: //右下
//计算高度
if( (sHeight-wHeight) > 0 ) //源图比水印图高
y1 = sHeight - wHeight;
else
y1 = sWidth;
//计算宽度
if( (sWidth - wWidth) > 0) // 源图比水印图宽
x1 = sWidth - wWidth;
else
x1 = sWidth;
break;
case 5: //居中
//计算高度
if( (sHeight-wHeight) > 0 ) //源图比水印图高
y1 = (sHeight - wHeight) / 2;
else
y1 = sWidth;
//计算宽度
if( (sWidth - wWidth) > 0) // 源图比水印图宽
x1 = (sWidth - wWidth) / 2;
else
x1 = sWidth;
break;
}
if( (sHeight-wHeight) > 0)
h = wHeight;
else
h = sHeight;
if( (sWidth - wWidth) > 0)
w = wWidth;
else
w = sWidth;
}
else //源图比水印图小
{
x1 = 0;
y1 = 0;
w = sWidth;
h = sHeight;
}
//开始绘图
for(x = 1; x < w; x++)
{
for(y = 1; y < h; y++)
{
al = alpha;
rl = wImage.GetPixel(x,y).R;
gl = wImage.GetPixel(x,y).G;
bl = wImage.GetPixel(x,y).B;
al = 70;
if(rl + 25 < 255)
rl += 25;
if(gl + 25 < 255)
gl += 25;
if(bl + 25 < 255)
bl += 25;
g.DrawEllipse(new Pen(new SolidBrush(Color.FromArgb(al,rl,gl,bl))),x1+x,y1+y,1,1);
}
}
g.Save();
sImage.Save(saveFile);
result = true;
}
catch
{
result = false;
}
return result;
}
private void btn_Water_Click(object sender, System.EventArgs e)
{
using(OpenFileDialog dlg = new OpenFileDialog())
{
if(dlg.ShowDialog() == DialogResult.OK)
{
string file = dlg.FileName;
if(File.Exists(file))
{
this.WaterFile = file;
imgWater.Image = new Bitmap(file);
}
}
dlg.Dispose();
}
}
}
}