您的位置:首页 > 编程语言 > ASP

ASP.NET 上传图片添加文字、Logo水印

2016-04-27 15:52 751 查看
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

/// <summary>
/// Helper 的摘要说明
/// </summary>
public class Helper
{
public class UpLoadHelper
{
#region 添加文字水印
/// <summary>
/// 添加文字水印
/// </summary>
/// <param name="text">水印文字</param>
/// <param name="file">图片文件</param>
public static void AttachText(string text, string file)
{
if (string.IsNullOrEmpty(text))
{
return;
}
if (!File.Exists(file))
{
return;
}
FileInfo oFile = new FileInfo(file);
string strTempFile = Path.Combine(oFile.DirectoryName, Guid.NewGuid().ToString() + oFile.Extension);
oFile.CopyTo(strTempFile);
Image img = Image.FromFile(strTempFile);
ImageFormat thisFormat = img.RawFormat;
int nHeight = img.Height;
int nWidth = img.Width;
Bitmap outBmp = new Bitmap(nWidth, nHeight);
Graphics g = Graphics.FromImage(outBmp);
g.Clear(Color.White);
// 设置画布的描绘质量
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(img, new Rectangle(0, 0, nWidth, nHeight), 0, 0, nWidth, nHeight, GraphicsUnit.Pixel);
int[] sizes = new int[] { 16, 14, 12, 10, 8, 6, 4 };
Font crFont = null;
SizeF crSize = new SizeF();
//通过循环这个数组,来选用不同的字体大小
//如果它的大小小于图像的宽度,就选用这个大小的字体
for (int i = 0; i < 7; i++)
{
//设置字体,这里是用arial,黑体
crFont = new Font("arial", sizes[i], FontStyle.Bold);
//Measure the Copyright string in this Font
crSize = g.MeasureString(text, crFont);
if ((ushort)crSize.Width < (ushort)nWidth)
{ break; }
}
//因为图片的高度可能不尽相同, 所以定义了
//从图片底部算起预留了5%的空间
int yPixlesFromBottom = (int)(nHeight * .08);
//现在使用版权信息字符串的高度来确定要绘制的图像的字符串的y坐标
float yPosFromBottom = ((nHeight - yPixlesFromBottom) - (crSize.Height / 2));
//计算x坐标
float xCenterOfImg = (nWidth / 2);
//把文本布局设置为居中
StringFormat StrFormat = new StringFormat();

StrFormat.Alignment = StringAlignment.Center;
//通过Brush来设置黑色半透明
SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(153, 0, 0, 0));
//绘制版权字符串
g.DrawString(text,             //版权字符串文本
crFont,                             //字体
semiTransBrush2,                           //Brush
new PointF(xCenterOfImg + 1, yPosFromBottom + 1),  //位置
StrFormat);              //设置成白色半透明
SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));
//第二次绘制版权字符串来创建阴影效果
//记住移动文本的位置1像素
g.DrawString(text,                 //版权文本
crFont,                                   //字体
semiTransBrush,                           //Brush
new PointF(xCenterOfImg, yPosFromBottom),  //位置
StrFormat);
g.Dispose();              // 以下代码为保存图片时,设置压缩质量
EncoderParameters encoderParams = new EncoderParameters();
long[] quality = new long[1];
quality[0] = 100;
EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
encoderParams.Param[0] = encoderParam;              //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICI = null;
for (int x = 0; x < arrayICI.Length; x++)
{
if (arrayICI[x].FormatDescription.Equals("JPEG"))
{
jpegICI = arrayICI[x];//设置JPEG编码
break;
}
} if (jpegICI != null)
{ outBmp.Save(file, jpegICI, encoderParams); }
else { outBmp.Save(file, thisFormat); }
img.Dispose();
outBmp.Dispose();
File.Delete(strTempFile);
}
#endregion
}
}


页面调用:Helper.UpLoadHelper.AttachText("水印文字", FileUpload1.PostedFile.FileName);

2,

/// <summary>
/// 增加图片文字水印
/// </summary>
/// <param name="filename">文件名</param>
/// <param name="watermarkText">水印文字</param>
/// <param name="watermarkStatus">图片水印位置</param>
/// <param name="quality">附加图片质量,1是 0不是</param>
public static void AddImageSignText(Image img, string filename, string watermarkText, int watermarkStatus, int quality, string fontname, int fontsize)
{
//System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(img);
//    .FromFile(filename);
Graphics g = Graphics.FromImage(img);
Font drawFont = new Font(fontname, fontsize, FontStyle.Regular, GraphicsUnit.Pixel);
SizeF crSize;
crSize = g.MeasureString(watermarkText, drawFont);

float xpos = 0;
float ypos = 0;

switch (watermarkStatus)
{
case 1:
xpos = (float)img.Width * (float).01;
ypos = (float)img.Height * (float).01;
break;
case 2:
xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
ypos = (float)img.Height * (float).01;
break;
case 3:
xpos = ((float)img.Width * (float).99) - crSize.Width;
ypos = (float)img.Height * (float).01;
break;
case 4:
xpos = (float)img.Width * (float).01;
ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
break;
case 5:
xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
break;
case 6:
xpos = ((float)img.Width * (float).99) - crSize.Width;
ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
break;
case 7:
xpos = (float)img.Width * (float).01;
ypos = ((float)img.Height * (float).99) - crSize.Height;
break;
case 8:
xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
ypos = ((float)img.Height * (float).99) - crSize.Height;
break;
case 9:
xpos = ((float)img.Width * (float).99) - crSize.Width;
ypos = ((float)img.Height * (float).99) - crSize.Height;
break;
}

//            System.Drawing.StringFormat StrFormat = new System.Drawing.StringFormat();
//            StrFormat.Alignment = System.Drawing.StringAlignment.Center;
//
//            g.DrawString(watermarkText, drawFont, new System.Drawing.SolidBrush(System.Drawing.Color.White), xpos + 1, ypos + 1, StrFormat);
//            g.DrawString(watermarkText, drawFont, new System.Drawing.SolidBrush(System.Drawing.Color.Black), xpos, ypos, StrFormat);
g.DrawString(watermarkText, drawFont, new SolidBrush(Color.White), xpos + 1, ypos + 1);
g.DrawString(watermarkText, drawFont, new SolidBrush(Color.Black), xpos, ypos);

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo ici = null;
foreach (ImageCodecInfo codec in codecs)
{
if (codec.MimeType.IndexOf("jpeg") > -1)
{
ici = codec;
}
}
EncoderParameters encoderParams = new EncoderParameters();
long[] qualityParam = new long[1];
if (quality < 0 || quality > 100)
{
quality = 80;
}
qualityParam[0] = quality;

EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);
encoderParams.Param[0] = encoderParam;

if (ici != null)
{
img.Save(filename, ici, encoderParams);
}
else
{
img.Save(filename);
}
g.Dispose();
//bmp.Dispose();
img.Dispose();
}


页面调用:、

Image img = Image.FromStream(this.FileUpload1.PostedFile.InputStream);

Helper.UpLoadHelper.AddImageSignText(img, FileUpload1.PostedFile.FileName, "水印文字", 1, 100, "宋体", 20);

3,加上LOGO图片水印

/// <summary>
/// 加上logo图片水印
/// </summary>
/// <param name="FilePath">源图片地址</param>
/// <param name="SavePath">图片保存路径</param>
public static void AddWaterMark(string FilePath, string SavePath,string logoPath)
{
Bitmap bitmap = new Bitmap(FilePath);
Graphics g = Graphics.FromImage(bitmap);

System.Drawing.Image logo = System.Drawing.Image.FromFile(logoPath);//加载logo图片
if (bitmap.Width < logo.Width || bitmap.Height <= logo.Height)
return;

//下面定义一个矩形区域,以后在这个矩形里画上透明背景和白色字体
float rectWidth = (float)logo.Width;
float rectHeight = (float)logo.Height;
float rectX = bitmap.Width - rectWidth;
float rectY = bitmap.Height - rectHeight;
//声明矩形域
RectangleF textArea = new RectangleF(rectX, rectY, rectWidth, rectHeight);
g.DrawImage(logo, textArea);
MemoryStream ms = new MemoryStream();
//保存为Jpg类型
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
g.Dispose();
bitmap.Dispose();
logo.Dispose();

FileStream fs = new FileStream(SavePath, FileMode.OpenOrCreate);
fs.Write(ms.ToArray(), 0, ms.ToArray().Length);
fs.Close();
}


页面调用:

Helper.UpLoadHelper.AddWaterMark(FileUpload1.PostedFile.FileName, Server.MapPath("~/images/aa.jpg"), FileUpload2.PostedFile.FileName);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: