C#的图片处理类,加水印及生成缩略图

C#的图片处理类,加水印及生成缩略图。缺点:1. GIF图片如果有多幅,加水印及生成的缩略图就只剩下一幅了。2. 水印效果不是太满意。 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->usingSystem;usingSystem.IO;usingSystem.Collections;usingSystem.Drawing;usingSystem.Drawing.Drawing2D;usingSystem.Drawing.Imaging;namespaceBLL{///summary///水印的类型////summarypublicenumWaterMarkType{///summary///文字水印////summaryTextMark,///summary///图片水印////summary//ImageMark//暂时只能添加文字水印};///summary///水印的位置////summarypublicenumWaterMarkPosition{///summary///左上角////summaryWMP_Left_Top,///summary///左下角////summaryWMP_Left_Bottom,///summary///右上角////summaryWMP_Right_Top,///summary///右下角////summaryWMP_Right_Bottom};///summary///处理图片的类(包括加水印,生成缩略图)////summarypublicclassImageWaterMark{publicImageWaterMark(){////TODO:在此处添加构造函数逻辑//}#region给图片加水印///summary///添加水印(分图片水印与文字水印两种)////summary///paramname="oldpath"原图片绝对地址/param///paramname="newpath"新图片放置的绝对地址/param///paramname="wmtType"要添加的水印的类型/param///paramname="sWaterMarkContent"水印内容,若添加文字水印,此即为要添加的文字;///若要添加图片水印,此为图片的路径/parampublicvoidaddWaterMark(stringoldpath,stringnewpath,WaterMarkTypewmtType,stringsWaterMarkContent){try{Imageimage=Image.FromFile(oldpath);Bitmapb=newBitmap(image.Width,image.Height,PixelFormat.Format24bppRgb);Graphicsg=Graphics.FromImage(b);g.Clear(Color.White);g.SmoothingMode=SmoothingMode.HighQuality;g.InterpolationMode=InterpolationMode.High;g.DrawImage(image,0,0,image.Width,image.Height);switch(wmtType){/*caseWaterMarkType.ImageMark://图片水印this.addWatermarkImage(g,Page.Server.MapPath(Watermarkimgpath),WatermarkPosition,image.Width,image.Height);break;*/caseWaterMarkType.TextMark://文字水印this.addWatermarkText(g,sWaterMarkContent,"WM_BOTTOM_RIGHT",image.Width,image.Height);break;}b.Save(newpath);b.Dispose();image.Dispose();}catch{if(File.Exists(oldpath)){File.Delete(oldpath);}}finally{if(File.Exists(oldpath)){File.Delete(oldpath);}}}///summary///加水印文字////summary///paramname="picture"imge对象/param///paramname="_watermarkText"水印文字内容/param///paramname="_watermarkPosition"水印位置/param///paramname="_width"被加水印图片的宽/param///paramname="_height"被加水印图片的高/paramprivatevoidaddWatermarkText(Graphicspicture,string_watermarkText,string_watermarkPosition,int_width,int_height){//确定水印文字的字体大小int[]sizes=newint[]{32,30,28,26,24,22,20,18,16,14,12,10,8,6,4};FontcrFont=null;SizeFcrSize=newSizeF();for(inti=0;isizes.Length;i++){crFont=newFont("ArialBlack",sizes[i],FontStyle.Bold);crSize=picture.MeasureString(_watermarkText,crFont);if((ushort)crSize.Width(ushort)_width){break;}}//生成水印图片(将文字写到图片中)BitmapfloatBmp=newBitmap((int)crSize.Width+3,(int)crSize.Height+3,PixelFormat.Format32bppArgb);Graphicsfg=Graphics.FromImage(floatBmp);PointFpt=newPointF(0,0);//画阴影文字BrushTransparentBrush0=newSolidBrush(Color.FromArgb(255,Color.Black));BrushTransparentBrush1=newSolidBrush(Color.FromArgb(255,Color.Black));fg.DrawString(_watermarkText,crFont,TransparentBrush0,pt.X,pt.Y+1);fg.DrawString(_watermarkText,crFont,TransparentBrush0,pt.X+1,pt.Y);fg.DrawString(_watermarkText,crFont,TransparentBrush1,pt.X+1,pt.Y+1);fg.DrawString(_watermarkText,crFont,TransparentBrush1,pt.X,pt.Y+2);fg.DrawString(_watermarkText,crFont,TransparentBrush1,pt.X+2,pt.Y);TransparentBrush0.Dispose();TransparentBrush1.Dispose();//画文字fg.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighQuality;fg.DrawString(_watermarkText,crFont,newSolidBrush(Color.White),pt.X,pt.Y,StringFormat.GenericDefault);//保存刚才的操作fg.Save();fg.Dispose();//floatBmp.Save("d:\\WebSite\\DIGITALKM\\ttt.jpg");//将水印图片加到原图中this.addWatermarkImage(picture,newBitmap(floatBmp),"WM_BOTTOM_RIGHT",_width,_height);}///summary///加水印图片////summary///paramname="picture"imge对象/param///paramname="iTheImage"Image对象(以此图片为水印)/param///paramname="_watermarkPosition"水印位置/param///paramname="_width"被加水印图片的宽/param///paramname="_height"被加水印图片的高/paramprivatevoidaddWatermarkImage(Graphicspicture,ImageiTheImage,string_watermarkPosition,int_width,int_height){Imagewatermark=newBitmap(iTheImage);ImageAttributesimageAttributes=newImageAttributes();ColorMapcolorMap=newColorMap();colorMap.OldColor=Color.FromArgb(255,0,255,0);colorMap.NewColor=Color.FromArgb(0,0,0,0);ColorMap[]remapTable={colorMap};imageAttributes.SetRemapTable(remapTable,ColorAdjustType.Bitmap);float[][]colorMatrixElements={newfloat[]{1.0f,0.0f,0.0f,0.0f,0.0f},newfloat[]{0.0f,1.0f,0.0f,0.0f,0.0f},newfloat[]{0.0f,0.0f,1.0f,0.0f,0.0f},newfloat[]{0.0f,0.0f,0.0f,0.3f,0.0f},newfloat[]{0.0f,0.0f,0.0f,0.0f,1.0f}};ColorMatrixcolorMatrix=newColorMatrix(colorMatrixElements);imageAttributes.SetColorMatrix(colorMatrix,ColorMatrixFlag.Default,ColorAdjustType.Bitmap);intxpos=0;intypos=0;intWatermarkWidth=0;intWatermarkHeight=0;doublebl=1d;//计算水印图片的比率//取背景的1/4宽度来比较if((_widthwatermark.Width*4)(_heightwatermark.Height*4)){bl=1;}elseif((_widthwatermark.Width*4)(_heightwatermark.Height*4)){bl=Convert.ToDouble(_height/4)/Convert.ToDouble(watermark.Height);}elseif((_widthwatermark.Width*4)(_heightwatermark.Height*4)){bl=Convert.ToDouble(_width/4)/Convert.ToDouble(watermark.Width);}else{if((_width*watermark.Height)(_height*watermark.Width)){bl=Convert.ToDouble(_height/4)/Convert.ToDouble(watermark.Height);}else{bl=Convert.ToDouble(_width/4)/Convert.ToDouble(watermark.Width);}}WatermarkWidth=Convert.ToInt32(watermark.Width*bl);WatermarkHeight=Convert.ToInt32(watermark.Height*bl);switch(_watermarkPosition){case"WM_TOP_LEFT":xpos=10;ypos=10;break;case"WM_TOP_RIGHT":xpos=_width-WatermarkWidth-10;ypos=10;break;case"WM_BOTTOM_RIGHT":xpos=_width-WatermarkWidth-10;ypos=_height-WatermarkHeight-10;break;case"WM_BOTTOM_LEFT":xpos=10;ypos=_height-WatermarkHeight-10;break;}picture.DrawImage(watermark,newRectangle(xpos,ypos,WatermarkWidth,WatermarkHeight),0,0,watermark.Width,watermark.Height,GraphicsUnit.Pixel,imageAttributes);watermark.Dispose();imageAttributes.Dispose();}///summary///加水印图片////summary///paramname="picture"imge对象/param///paramname="WaterMarkPicPath"水印图片的地址/param///paramname="_watermarkPosition"水印位置/param///paramname="_width"被加水印图片的宽/param///paramname="_height"被加水印图片的高/paramprivatevoidaddWatermarkImage(Graphicspicture,stringWaterMarkPicPath,string_watermarkPosition,int_width,int_height){Imagewatermark=newBitmap(WaterMarkPicPath);this.addWatermarkImage(picture,watermark,_watermarkPosition,_width,_height);}#endregion#region生成缩略图///summary///保存图片////summary///paramname="image"Image对象/param///paramname="savePath"保存路径/param///paramname="ici"指定格式的编解码参数/paramprivatevoidSaveImage(Imageimage,stringsavePath,ImageCodecInfoici){//设置原图片对象的EncoderParameters对象EncoderParametersparameters=newEncoderParameters(1);parameters.Param[0]=newEncoderParameter(System.Drawing.Imaging.Encoder.Quality,((long)90));image.Save(savePath,ici,parameters);parameters.Dispose();}///summary///获取图像编码解码器的所有相关信息////summary///paramname="mimeType"包含编码解码器的多用途网际邮件扩充协议(MIME)类型的字符串/param///returns返回图像编码解码器的所有相关信息/returnsprivateImageCodecInfoGetCodecInfo(stringmimeType){ImageCodecInfo[]CodecInfo=ImageCodecInfo.GetImageEncoders();foreach(ImageCodecInfoiciinCodecInfo){if(ici.MimeType==mimeType)returnici;}returnnull;}///summary///生成缩略图////summary///paramname="sourceImagePath"原图片路径(相对路径)/param///paramname="thumbnailImagePath"生成的缩略图路径,如果为空则保存为原图片路径(相对路径)/param///paramname="thumbnailImageWidth"缩略图的宽度(高度与按源图片比例自动生成)/parampublicvoidToThumbnailImages(stringSourceImagePath,stringThumbnailImagePath,intThumbnailImageWidth){Hashtablehtmimes=newHashtable();htmimes[".jpeg"]="image/jpeg";htmimes[".jpg"]="image/jpeg";htmimes[".png"]="image/png";htmimes[".tif"]="image/tiff";htmimes[".tiff"]="image/tiff";htmimes[".bmp"]="image/bmp";htmimes[".gif"]="image/gif";//取得原图片的后缀stringsExt=SourceImagePath.Substring(SourceImagePath.LastIndexOf(".")).ToLower();//从原图片创建Image对象Imageimage=Image.FromFile(SourceImagePath);intnum=((ThumbnailImageWidth/4)*3);intwidth=image.Width;intheight=image.Height;//计算图片的比例if((((double)width)/((double)height))=1.3333333333333333f){num=((height*ThumbnailImageWidth)/width);}else{ThumbnailImageWidth=((width*num)/height);}if((ThumbnailImageWidth1)||(num1)){return;}//用指定的大小和格式初始化Bitmap类的新实例Bitmapbitmap=newBitmap(ThumbnailImageWidth,num,PixelFormat.Format32bppArgb);//从指定的Image对象创建新Graphics对象Graphicsgraphics=Graphics.FromImage(bitmap);//清除整个绘图面并以透明背景色填充graphics.Clear(Color.Transparent);graphics.SmoothingMode=SmoothingMode.HighQuality;graphics.InterpolationMode=InterpolationMode.High;//在指定位置并且按指定大小绘制原图片对象graphics.DrawImage(image,newRectangle(0,0,ThumbnailImageWidth,num));image.Dispose();try{//将此原图片以指定格式并用指定的编解码参数保存到指定文件SaveImage(bitmap,ThumbnailImagePath,GetCodecInfo((string)htmimes[sExt]));}catch(System.Exceptione){throwe;}}#endregion}}
源码下载
posted @ 2013-01-12 11:07  gnhao  阅读(262)  评论(0)    收藏  举报