1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C#为图片添加水印 生成缩略图

C#为图片添加水印 生成缩略图

时间:2018-11-08 01:28:32

相关推荐

C#为图片添加水印 生成缩略图

文章引用自/post/115.html,自己略微作了些修改

代码 usingSystem; usingSystem.IO; usingSystem.Collections; usingSystem.Drawing; usingSystem.Drawing.Drawing2D; usingSystem.Drawing.Imaging; namespaceImag_writer { ///<summary>///水印的类型 ///</summary>publicenumWaterMarkType { ///<summary>///文字水印///</summary>TextMark, ///<summary>///图片水印///</summary>//ImageMark//暂时只能添加文字水印}; ///<summary>///水印的位置 ///</summary>publicenumWaterMarkPosition { ///<summary>///左上角///</summary>WMP_Left_Top, ///<summary>///左下角///</summary>WMP_Left_Bottom, ///<summary>///右上角///</summary>WMP_Right_Top, ///<summary>///右下角///</summary>WMP_Right_Bottom }; ///<summary>///指定水印的位置///</summary>publicclassPosition { ///<summary>///左上角///</summary>publicstringWM_TOP_LEFT="WM_TOP_LEFT"; ///<summary>///左下角///</summary>publicstringWM_BOTTOM_LEFT="WM_BOTTOM_LEFT"; ///<summary>///右上角///</summary>publicstringWM_TOP_RIGHT="WM_TOP_RIGHT"; ///<summary>///右下角///</summary>publicstringWM_BOTTOM_RIGHT="WM_BOTTOM_RIGHT"; } ///<summary>///处理图片的类(包括加水印,生成缩略图)///</summary>publicclassImageWaterMark {publicImageWaterMark() { ////TODO:在此处添加构造函数逻辑//} #region给图片加水印 ///<summary>///添加水印(分图片水印与文字水印两种)///</summary>///<paramname="oldpath">原图片绝对地址</param>///<paramname="newpath">新图片放置的绝对地址</param>///<paramname="wmtType">要添加的水印的类型</param>///<paramname="sWaterMarkContent">水印内容,若添加文字水印,此即为要添加的文字;///若要添加图片水印,此为图片的路径</param>publicvoidaddWaterMark(stringoldpath,stringnewpath, WaterMarkTypewmtType,stringsWaterMarkContent,stringposition) {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.TextMark: //文字水印//this.addWatermarkText(g,sWaterMarkContent,"WM_BOTTOM_RIGHT",//image.Width,image.Height);this.addWatermarkText(g,sWaterMarkContent,position, 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">被加水印图片的高</param>privatevoidaddWatermarkText(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;i<sizes.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), _watermarkPosition,//"WM_BOTTOM_RIGHT",_width, _height); } ///<summary>///加水印图片///</summary>///<paramname="picture">imge对象</param>///<paramname="iTheImage">Image对象(以此图片为水印)</param>///<paramname="_watermarkPosition">水印位置</param>///<paramname="_width">被加水印图片的宽</param>///<paramname="_height">被加水印图片的高</param>privatevoidaddWatermarkImage(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((_width>watermark.Width*4)&&(_height>watermark.Height*4)) { bl=1; }elseif((_width>watermark.Width*4)&&(_height<watermark.Height*4)) { bl=Convert.ToDouble(_height/4)/Convert.ToDouble(watermark.Height); }elseif((_width<watermark.Width*4)&&(_height>watermark.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">被加水印图片的高</param>privatevoidaddWatermarkImage(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">指定格式的编解码参数</param>privatevoidSaveImage(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>返回图像编码解码器的所有相关信息</returns>privateImageCodecInfoGetCodecInfo(stringmimeType) { ImageCodecInfo[]CodecInfo=ImageCodecInfo.GetImageEncoders(); foreach(ImageCodecInfoiciinCodecInfo) {if(ici.MimeType==mimeType)returnici; }returnnull; } ///<summary>///生成缩略图///</summary>///<paramname="sourceImagePath">原图片路径(相对路径)</param>///<paramname="thumbnailImagePath">生成的缩略图路径,如果为空则保存为原图片路径(相对路径)</param>///<paramname="thumbnailImageWidth">缩略图的宽度(高度与按源图片比例自动生成)</param>publicvoidToThumbnailImages( 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((ThumbnailImageWidth<1)||(num<1)) {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 } //测试代码privatevoidbutton1_Click(objectsender,EventArgse) { stringpath=@"C:\pics\input\Goolge.png"; stringsavepath=@"C:\pics\input\Goolge2.png"; stringthumpath=@"C:\pics\input\Goolge3.png"; ImageWaterMarkimgwm=newImageWaterMark(); Positionps=newPosition(); imgwm.addWaterMark(path,savepath,WaterMarkType.TextMark,"SHW",ps.WM_TOP_RIGHT); //imgwm.addWaterMark(path,savepath,WaterMarkType.TextMark,"SHW");//imgwm.ToThumbnailImages(path,thumpath,50);} }

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。