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

C# :实现水印与图片合成,并利用Graphics 压缩图像质量 , (委托实现listBox的动态添加提示)

2012-05-02 19:17 1001 查看
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.IO;
using System.Drawing.Text;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Threading;
namespace FontDemo
{
public partial class MarkImage : Form
{
int i = 0;
public MarkImage()
{
InitializeComponent();
}

private void MarkImage_Load(object sender, EventArgs e)
{

}

/// <summary>
/// 保存图片 " 图片水印 "
/// </summary>
/// <param name="InUploadImagePath">原服务器图片路径</param>
///<param name="inLogoImagePath">生成的带图片水印的图片路径</param>
///<param name="InSavePath">水印图片路径</param>
///<param name="strType">原图片文件类型</param>
public void MarkToImage(string InUploadImagePath, string inLogoImagePath, string InSavePath, string strType)
{
//FileStream fs = new FileStream(System.Windows.Forms.Application.StartupPath + @"\Img\" + InUploadImagePath, FileMode.Open, FileAccess.ReadWrite);
//System.Drawing.Image img = System.Drawing.Image.FromStream(fs, false, false);
//Bitmap bmp = new Bitmap(img);
//img.Dispose();
//fs.Close();

//System.Drawing.Image Image = bmp;
//System.Drawing.Image newimage = System.Drawing.Image.FromFile(System.Windows.Forms.Application.StartupPath + @"\" + inLogoImagePath);
//Graphics g = Graphics.FromImage(Image);
//g.DrawImage(newimage, new Rectangle(Image.Width - newimage.Width, Image.Height - newimage.Height, newimage.Width, newimage.Height), 0, 0, newimage.Width, newimage.Height, GraphicsUnit.Pixel);

//System.Drawing.Image Image = System.Drawing.Image.FromFile(System.Windows.Forms.Application.StartupPath + @"\Img\" +InUploadImagePath);
//System.Drawing.Image newimage = System.Drawing.Image.FromFile(System.Windows.Forms.Application.StartupPath + @"\" +inLogoImagePath);
//Graphics g = Graphics.FromImage(Image);
//g.DrawImage(newimage, new Rectangle(Image.Width - newimage.Width, Image.Height - newimage.Height, newimage.Width, newimage.Height), 0, 0, newimage.Width, newimage.Height, GraphicsUnit.Pixel);
//g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//g.InterpolationMode = InterpolationMode.HighQualityBicubic;
//g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;

//Image.Save(System.Windows.Forms.Application.StartupPath + @"\ImgBak\" + InSavePath);
//string pith = "C:\\Documents and Settings\\Administrator\\桌面\\临时目录\\IMg-09-07-21\\FontDemo\\FontDemo\\bin\\Debug\\ImgBak\\" + InSavePath;
//Image.Save(pith);
//System.Windows.Forms.Application.StartupPath = "C:\\Documents and Settings\\Administrator\\桌面\\临时目录\\IMg-09-07-21\\FontDemo\\FontDemo\\bin\\Debug"

Bitmap imgTemp = new Bitmap(System.Windows.Forms.Application.StartupPath + @"\Img\" + InUploadImagePath);//创建Image对象,大小为200 * 200
Graphics gType = Graphics.FromImage(imgTemp);//在Image对象上创建Graphics对象g2
GraphicsPath typePath = new GraphicsPath();
Bitmap img = new Bitmap(System.Windows.Forms.Application.StartupPath + @"\" + inLogoImagePath);//创建Image对象,大小为200 * 200

try
{
//gType.DrawImage(img, 590, 1100, img.Width, img.Height);
gType.DrawImage(img, new Rectangle(imgTemp.Width - img.Width, imgTemp.Height - img.Height, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);

string ps = System.Windows.Forms.Application.StartupPath + @"\ImgBak\" + InUploadImagePath;
imgTemp.Save(ps, System.Drawing.Imaging.ImageFormat.Png);

}
catch (Exception de)
{
MessageBox.Show(de.Message);
}
finally
{
//MyItem item1 = new MyItem();
//item1.id = i.ToString();
//item1.name = InUploadImagePath + " - 已生成..";

//i++;

//this.listBox1.Items.Add(item1);
//this.pictureBox1.Image = imgTemp;

typePath.Dispose();
imgTemp.Dispose();
img.Dispose();
//newimage.Dispose();
}
}

private void button1_Click(object sender, EventArgs e)
{
this.listBox1.Items.Clear();

MethodInvoker mi = new MethodInvoker(Add);
mi.BeginInvoke(null, null);

}

public  class MyItem : object
{
public  string name;
public  string id;
public override string ToString()
{
// TODO:   添加 MyItem.ToString 实现
return name;
}
}

public delegate void delegateMethod(string fileName, Bitmap imgTem);

public void Add()
{
DelegateChangeButton bu = new DelegateChangeButton(ButtonEnable);
this.BeginInvoke(bu, new object[] { false });

string sd = AppDomain.CurrentDomain.BaseDirectory + "Img";
string[] files = Directory.GetFiles(sd);
foreach (string f in files)
{
if (f.LastIndexOf("\\") != -1)
{
string strFile = f.Substring(f.LastIndexOf("\\") + 1);
string strType = strFile.Substring(strFile.Length - 3, 3);
if (strType.ToLower() == "bmp" || strType.ToLower() == "png" || strType.ToLower() == "jpg")
{
Bitmap imgTemp = new Bitmap(System.Windows.Forms.Application.StartupPath + @"\Img\" + strFile);//创建Image对象,大小为200 * 200
Graphics gType = Graphics.FromImage(imgTemp);//在Image对象上创建Graphics对象g2
GraphicsPath typePath = new GraphicsPath();
Bitmap img = new Bitmap(System.Windows.Forms.Application.StartupPath + @"\" + "ddK.png");//创建Image对象,大小为200 * 200

if (imgTemp.Width >= 400 && imgTemp.Height >= 150)
{

try
{
////EncoderParameter p;
////EncoderParameters ps;
////ps = new EncoderParameters(1);
////p = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.CompressionLZW);
////ps.Param[0] = p;

////gType.DrawImage(img, new Rectangle(imgTemp.Width - img.Width, imgTemp.Height - img.Height, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
////gType.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
////gType.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
////gType.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;

////string pngB = System.Windows.Forms.Application.StartupPath + @"\ImgBak\" + strFile;
////imgTemp.Save(pngB, GetCodecInfo("image/bmp"), ps);

//EncoderParameter p;
//EncoderParameters ps;
//ps = new EncoderParameters(1);

////p = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionRle);
//long sdd = (long)EncoderValue.CompressionRle;
//p = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.TransformRotate270);
//ps.Param[0] = p;

gType.DrawImage(img, new Rectangle(imgTemp.Width - img.Width, imgTemp.Height - img.Height, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
//gType.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//gType.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//gType.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;

string pngB = System.Windows.Forms.Application.StartupPath + @"\ImgBak\" + strFile;
//imgTemp.Save(pngB, GetCodecInfo("image/jpeg"), ps);

//imgTemp.Save(pngB, System.Drawing.Imaging.ImageFormat.Png);
EncoderParameters encoderParams = new EncoderParameters();
long[] quality = new long[1];
quality[0] = 92; //压缩比例,决定图片大小的重要因素。
EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
encoderParams.Param[0] = encoderParam;

imgTemp.Save(System.Windows.Forms.Application.StartupPath + @"\ImgBak\" + strFile, GetCodecInfo("image/jpeg"), encoderParams);

if (listBox1.InvokeRequired)
{
delegateMethod m = new delegateMethod(Referesh);
this.BeginInvoke(m, new object[] { strFile, imgTemp });
}
else
{
Referesh(strFile, imgTemp);
}
Thread.Sleep(100);

//EncoderParameters encoderParams = new EncoderParameters();
//long[] quality = new long[1];
//quality[0] = 90;
//EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
//encoderParams.Param[0] = encoderParam;
//Bitmap imgLast = new Bitmap(pngB);//创建Image对象
//imgLast.Save(System.Windows.Forms.Application.StartupPath + @"\images\" + strFile, GetCodecInfo("image/jpeg"), encoderParams);

// SmallPic(pngB, System.Windows.Forms.Application.StartupPath + @"\images\" + strFile, imgTemp.Width, imgTemp.Height);
}
catch (Exception de)
{
MessageBox.Show(de.Message);
}
finally
{

typePath.Dispose();
//imgTemp.Dispose();
//img.Dispose();
}
}
}
}
}

delegateMethodEND en = new delegateMethodEND(EndList);
this.BeginInvoke(en);

this.BeginInvoke(bu, new object[] { true });

}

/**//// <summary>
/// 保存JPG时用
/// </summary>
/// <param name="mimeType"></param>
/// <returns>得到指定mimeType的ImageCodecInfo</returns>
private  ImageCodecInfo GetCodecInfo(string mimeType)
{
ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
foreach (ImageCodecInfo ici in CodecInfo)
{
if (ici.MimeType == mimeType) return ici;
}
return null;
}

public void ButtonEnable(bool flag)
{
this.button1.Enabled = flag;
}
public void Referesh(string fileName, Bitmap imgTem)
{
listBox1.Items.Add(DateTime.Now.ToShortTimeString() + @"分 - ImgBak\" + fileName + "  已生成");
listBox1.SelectedIndex = listBox1.Items.Count - 1;
this.pictureBox1.Image = imgTem;

Application.DoEvents();
}

public void EndList()
{
listBox1.Items.Add(DateTime.Now.ToShortTimeString() + @"分  -网站所有水印图生成结束!");
listBox1.SelectedIndex = listBox1.Items.Count - 1;

}
public delegate void delegateMethodEND();
public delegate void DelegateChangeButton(bool flag);

//public delegate void DelegateChangeIMG(Bitmap imgTem);

public  bool SmallPic(string strOldPic, string strNewPic, int widthEx, int heightEx)
{//提供原始图片,目标路径,以及想要生成的缩略图尺寸
System.Drawing.Bitmap objPic, objNewPic;
objPic = new System.Drawing.Bitmap(strOldPic);
int width, height;
width = objPic.Width;
height = objPic.Height;

if ((int)(height / heightEx) >= (int)(width / widthEx))
{//高度压缩比例大于宽度
SmallPicW(strOldPic, strNewPic, heightEx, widthEx);
objPic.Dispose();
return true;
}
else
{//高度压缩比例小于宽度
SmallPicH(strOldPic, strNewPic, widthEx, heightEx);
objPic.Dispose();
return true;
}
}

///下面这个函数处理高度压缩比例小于宽度的情况
private  void SmallPicH(string strOldPic, string strNewPic, int intWidth, int descHeight)
{
System.Drawing.Bitmap objPic, smallObjPic, objNewPic;
objPic = null;
objNewPic = null;
smallObjPic = null;
try
{
objPic = new System.Drawing.Bitmap(strOldPic);

//将原始图片放入到内存里
int intHeight = (intWidth * objPic.Height) / objPic.Width;
smallObjPic = new System.Drawing.Bitmap(objPic, intWidth, intHeight);
objNewPic = new System.Drawing.Bitmap(intWidth, descHeight, PixelFormat.Format64bppPArgb);
//在内存里生成一张跟缩略图尺寸一样的空图片。
objNewPic.SetResolution(objPic.HorizontalResolution, objPic.VerticalResolution);
Graphics grPhoto = Graphics.FromImage(objNewPic);
if (objPic.Width < intWidth)
{
grPhoto.FillRectangle(System.Drawing.Brushes.White, 0, 0, intWidth, descHeight);
grPhoto.DrawImage(smallObjPic, new Rectangle((intWidth - objPic.Width) / 2,
(descHeight - objPic.Height) / 2, objPic.Width, objPic.Height));
}
else
{
grPhoto.FillRectangle(System.Drawing.Brushes.White, 0, 0, intWidth, descHeight);
grPhoto.DrawImage(smallObjPic, new Rectangle(0, (descHeight - intHeight) / 2, intWidth, intHeight)
, 0, 0, intWidth, intHeight, System.Drawing.GraphicsUnit.Pixel);
}

#region  保存图片
EncoderParameters encoderParams = new EncoderParameters();
long[] quality = new long[1];
quality[0] = 90;
EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
encoderParams.Param[0] = encoderParam;
//获得包含对应的图片编解码程序
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICI = null;
for (int x = 0; x < arrayICI.Length; x++)
{
if (arrayICI[x].FormatDescription.Equals("JPEG"))
{
jpegICI = arrayICI[x];//
break;
}
}
if (jpegICI != null)
{
objNewPic.Save(strNewPic, jpegICI, encoderParams);
}
else
{
objNewPic.Save(strNewPic, System.Drawing.Imaging.ImageFormat.Jpeg);
}
objPic.Dispose();
objPic = null;
objNewPic.Dispose();
objNewPic = null;
smallObjPic.Dispose();
smallObjPic = null;
#endregion

}
catch (Exception exp)
{
}
finally
{
if (objPic != null)
objPic.Dispose();
if (objNewPic != null)
objNewPic.Dispose();
if (smallObjPic != null)
smallObjPic.Dispose();
objPic = null;
objNewPic = null;
smallObjPic = null;
}
}

///以下函数是处理高度压缩比例大于宽度的情况
private  void SmallPicW(string strOldPic, string strNewPic, int intHeight, int descWidth)
{
System.Drawing.Bitmap objPic, smallObjPic, objNewPic;
objPic = null;
objNewPic = null;
smallObjPic = null;
try
{
objPic = new System.Drawing.Bitmap(strOldPic);
int intWidth = (intHeight * objPic.Width) / objPic.Height;

smallObjPic = new System.Drawing.Bitmap(objPic, intWidth, intHeight);
objNewPic = new System.Drawing.Bitmap(descWidth, intHeight, PixelFormat.Format64bppPArgb);
objNewPic.SetResolution(objPic.HorizontalResolution, objPic.VerticalResolution);
Graphics grPhoto = Graphics.FromImage(objNewPic);

if (objPic.Height < intHeight)
{//
grPhoto.FillRectangle(System.Drawing.Brushes.White, 0, 0, descWidth, intHeight);
Rectangle r = new Rectangle((descWidth - objPic.Width) / 2, (intHeight - objPic.Height) / 2,
intWidth, objPic.Height);
grPhoto.DrawImage(smallObjPic, r);
}
else
{
grPhoto.FillRectangle(System.Drawing.Brushes.White, 0, 0, descWidth, intHeight);
grPhoto.DrawImage(smallObjPic, new Rectangle((descWidth - intWidth) / 2, 0, intWidth, intHeight),
, 0, intWidth, intHeight, System.Drawing.GraphicsUnit.Pixel);
}
#region
EncoderParameters encoderParams = new EncoderParameters();
long[] quality = new long[1];
quality[0] = 90;
EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
encoderParams.Param[0] = encoderParam;
//
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICI = null;
for (int x = 0; x < arrayICI.Length; x++)
{
if (arrayICI[x].FormatDescription.Equals("JPEG"))
{
jpegICI = arrayICI[x];//
break;
}
}
if (jpegICI != null)
{
objNewPic.Save(strNewPic, jpegICI, encoderParams);
}
else
{
objNewPic.Save(strNewPic, System.Drawing.Imaging.ImageFormat.Jpeg);
}
objPic.Dispose();
objPic = null;
objNewPic.Dispose();
objNewPic = null;
smallObjPic.Dispose();
smallObjPic = null;
#endregion

}
catch (Exception exp)
{
throw exp;
}
finally
{
if (objPic != null)
objPic.Dispose();
if (objNewPic != null)
objNewPic.Dispose();
if (smallObjPic != null)
smallObjPic.Dispose();
objPic = null;
smallObjPic = null;
objNewPic = null;
}
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐