水印及缩略图的C#实现

老早以前写的,害怕以后忘了或找不到了,发到这里以备忘。

using  System;
using  System.IO;
using  System.Drawing;
using  System.Drawing.Imaging;

///   <summary>
///  PictureMarker 的摘要说明。
///   </summary>
public   class  PictureMarker
{
    
///   <summary>
    
///  PictureMarker的构造函数
    
///   </summary>
     public  PictureMarker()
    {
    }

    
///   <summary>
    
///  PictureMarker的构造函数
    
///   </summary>
    
///   <param name="width"> 缩略图的宽度 </param>
    
///   <param name="height"> 缩略图的高度 </param>
    
///   <param name="ismust"> 是否一定要生成缩略图,推荐为false </param>
     public  PictureMarker( int  width,  int  height,  bool  ismust)
    {
        
this .width  =  width;
        
this .height  =  height;
        
this .ismust  =  ismust;
    }

    
///   <summary>
    
///  PictureMarker的构造函数
    
///   </summary>
    
///   <param name="width"> 缩略图的宽度 </param>
    
///   <param name="height"> 缩略图的高度 </param>
    
///   <param name="ismust"> 是否一定要生成缩略图,推荐为false </param>
    
///   <param name="isSavePrimaryPic"> 是否要保存源图片 </param>
    
///   <param name="primaryPicPath"> 源图片的保存目录 </param>
     public  PictureMarker( int  width,  int  height,  bool  ismust,  bool  isSavePrimaryPic,  string  primaryPicPath)
        : 
this (width, height, ismust)
    {
        
this .isSavePrimaryPic  =  isSavePrimaryPic;
        
this .primaryPicPath  =  primaryPicPath;
    }

    
private   int  width;
    
private   int  height;
    
private   bool  ismust  =   false ;
    
private   bool  isSavePrimaryPic  =   false ;
    
private   string  primaryPicPath;

    
///   <summary>
    
///  缩略图的宽度
    
///   </summary>
     public   int  Width
    {
        
get  {  return  width; }
        
set  { width  =  value; }
    }

    
///   <summary>
    
///  缩略图的高度
    
///   </summary>
     public   int  Height
    {
        
get  {  return  height; }
        
set  { height  =  value; }
    }

    
///   <summary>
    
///  是否一定要生成缩略图,推荐为false
    
///   </summary>
     public   bool  IsMust
    {
        
get  {  return  ismust; }
        
set  { ismust  =  value; }
    }

    
///   <summary>
    
///  是否要保存源图片
    
///   </summary>
     public   bool  IsSavePrimaryPic
    {
        
get  {  return  isSavePrimaryPic; }
        
set  { isSavePrimaryPic  =  value; }
    }

    
///   <summary>
    
///  源图片的保存目录
    
///   </summary>
     public   string  PrimaryPicPath
    {
        
get  {  return  primaryPicPath; }
        
set  { primaryPicPath  =  value; }
    }

    
///   <summary>
    
///  在图片上添加版权信息水印
    
///   </summary>
    
///   <param name="input"> 目标图片 </param>
    
///   <param name="copyright"> 文字版权信息 </param>
    
///   <param name="savepath"> 保存路径 </param>
    
///   <param name="position"> 水印显示位置 </param>
     public   void  CreateMark(Stream input,  string  copyright,  string  savepath, WaterPosition position)
    {
        
int  xpoint, ypoint;
        System.Drawing.Image photo 
=  System.Drawing.Image.FromStream(input);
        
int  pwidth  =  photo.Width;
        
int  pheight  =  photo.Height;
        Bitmap markpic 
=   new  Bitmap(photo);
        markpic.SetResolution(photo.HorizontalResolution, photo.VerticalResolution);

        Graphics graphics 
=  Graphics.FromImage(markpic);

        xpoint 
=  (pwidth  -   100 /   2 ;
        ypoint 
=  pheight  -   40 ;
        graphics.DrawString(copyright, 
new  Font( " 楷体 " 15 ),  new  System.Drawing.SolidBrush(Color.FromArgb( 255 0 255 255 )),
            
new  RectangleF(xpoint, ypoint,  400 30 ));


        
try
        {
            markpic.Save(savepath);
        }
        
finally
        {
            input.Close();
            photo.Dispose();
            markpic.Dispose();
            graphics.Dispose();
        }
    }

    
///   <summary>
    
///  在图片上添加版权信息水印
    
///   </summary>
    
///   <param name="input"> 目标图片 </param>
    
///   <param name="copyright"> 图片版权信息 </param>
    
///   <param name="savepath"> 保存路径 </param>
    
///   <param name="position"> 水印显示位置 </param>
     public   void  CreateMark(Stream input, Stream copyright,  string  savepath, WaterPosition position)
    {
        
int  xpoint, ypoint;
        System.Drawing.Image photo 
=  System.Drawing.Image.FromStream(input);
        System.Drawing.Image copy 
=  System.Drawing.Image.FromStream(copyright);
        
int  pwidth  =  photo.Width;
        
int  pheight  =  photo.Height;
        
int  cwidth  =  copy.Width;
        
int  cheight  =  copy.Height;
        
if  (pwidth  -  cwidth  <   20   ||  pheight  -  cheight  <   20 )
        {
            input.Close();
            copyright.Close();
            photo.Dispose();
            copy.Dispose();
            
throw   new  ArgumentException( " 不合适的图片尺寸.目标图片比版权图片至少宽20像素,高20像素. " );
        }

        
if  (isSavePrimaryPic)
        {
            
if  (primaryPicPath  ==   null   ||  primaryPicPath  ==   "" )
            {
                input.Close();
                copyright.Close();
                photo.Dispose();
                copy.Dispose();
                
throw   new  ArgumentException( " 当要求保存源图片时,源图片的保存路径不能为空 " );
            }

            
try
            {
                photo.Save(primaryPicPath 
+   " \\ "   +  Path.GetFileName(savepath)  +   " .jpg " , ImageFormat.Jpeg);
            }
            
catch  (Exception ex)
            {
                input.Close();
                copyright.Close();
                photo.Dispose();
                copy.Dispose();

                
throw  ex;
            }
        }

        Bitmap markpic 
=   new  Bitmap(photo);
        markpic.SetResolution(photo.HorizontalResolution, photo.VerticalResolution);

        Graphics graphics 
=  Graphics.FromImage(markpic);
        System.Drawing.Imaging.ImageAttributes att 
=   new  System.Drawing.Imaging.ImageAttributes();

        
float [][] matrixelements  =  { 

                                           
new   float [] { 1.0f ,   0.0f ,   0.0f ,   0.0f 0.0f },

                                           
new   float [] { 0.0f ,   1.0f ,   0.0f ,   0.0f 0.0f },

                                           
new   float [] { 0.0f ,   0.0f ,   1.0f ,   0.0f 0.0f },

                                           
new   float [] { 0.0f ,   0.0f ,   0.0f ,   0.5f 0.0f },

                                           
new   float [] { 0.0f ,   0.0f ,   0.0f ,   0.0f 1.0f }};

        System.Drawing.Imaging.ColorMatrix matrix 
=   new  System.Drawing.Imaging.ColorMatrix(matrixelements);

        att.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

        
switch  (position)
        {
            
case  WaterPosition.Left:
                xpoint 
=   10 ;
                ypoint 
=  (pheight  -  cheight)  /   2 ;
                
break ;
            
case  WaterPosition.LeftUp:
                xpoint 
=   10 ;
                ypoint 
=   10 ;
                
break ;
            
case  WaterPosition.MiddleUp:
                xpoint 
=  (pwidth  -  cwidth)  /   2 ;
                ypoint 
=   10 ;
                
break ;
            
case  WaterPosition.RightUp:
                xpoint 
=  pwidth  -  cwidth  -   10 ;
                ypoint 
=   10 ;
                
break ;
            
case  WaterPosition.Right:
                xpoint 
=  pwidth  -  cwidth  -   10 ;
                ypoint 
=  (pheight  -  cheight)  /   2 ;
                
break ;
            
case  WaterPosition.RightDown:
                xpoint 
=  pwidth  -  cwidth  -   10 ;
                ypoint 
=  pheight  -  cheight  -   10 ;
                
break ;
            
case  WaterPosition.MiddleDown:
                xpoint 
=  (pwidth  -  cwidth)  /   2 ;
                ypoint 
=  pheight  -  cheight  -   10 ;
                
break ;
            
case  WaterPosition.LeftDown:
                xpoint 
=   10 ;
                ypoint 
=  pheight  -  cheight  -   10 ;
                
break ;
            
default :
                xpoint 
=  (pwidth  -  cwidth)  /   2 ;
                ypoint 
=  (pheight  -  cheight)  /   2 ;
                
break ;
        };

        graphics.DrawImage(copy, 
new  Rectangle(xpoint, ypoint, cwidth, cheight),  0 0 , cwidth, cheight, GraphicsUnit.Pixel, att);

        
if  (width  !=   0   &&  height  !=   0 )
        {
            
if  (ismust)
            {
                
int  twidth, theight;
                
if  (markpic.Width  *  height  >  markpic.Height  *  width)
                {
                    twidth 
=  width;
                    theight 
=  markpic.Height  *  width  /  markpic.Width;
                }
                
else
                {
                    theight 
=  height;
                    twidth 
=  markpic.Width  *  height  /  markpic.Height;
                }

                markpic.SetResolution(twidth, theight);
                markpic 
=  (Bitmap)markpic.GetThumbnailImage(twidth, theight,  null new  IntPtr());
            }
            
else
            {
                
if  (width  <  markpic.Width  ||  height  <  markpic.Height)
                {
                    
if  (width  <  markpic.Width  ||  height  <  markpic.Height)
                    {
                        
int  twidth, theight;
                        
if  (markpic.Width  *  height  >  markpic.Height  *  width)
                        {
                            twidth 
=  width;
                            theight 
=  markpic.Height  *  width  /  markpic.Width;
                        }
                        
else
                        {
                            theight 
=  height;
                            twidth 
=  markpic.Width  *  height  /  markpic.Height;
                        }

                        markpic.SetResolution(twidth, theight);
                        markpic 
=  (Bitmap)markpic.GetThumbnailImage(twidth, theight,  null new  IntPtr());
                    }
                }
            }
        }

        
try
        {
            markpic.Save(savepath, ImageFormat.Jpeg);
        }
        
finally
        {
            graphics.Dispose();
            input.Close();
            copyright.Close();
            photo.Dispose();
            copy.Dispose();
            markpic.Dispose();
        }
    }


    
///   <summary>
    
///  在图片上添加版权信息水印
    
///   </summary>
    
///   <param name="input"> 目标图片 </param>
    
///   <param name="copyright"> 版权信息,可以为图片路径或文字版权信息 </param>
    
///   <param name="directory"> 保存目录 </param>
    
///   <param name="filename"> 保存文件名 </param>
    
///   <param name="isDrectory"> copyright是否为文件路径 </param>
    
///   <param name="position"> 水印显示位置 </param>
     public   void  CreateMark(Stream input,  string  copyright,  string  directory,  string  filename,  bool  isDrectory, WaterPosition position)
    {
        
if  (isDrectory)
        {
            FileStream _copyright 
=   new  FileStream(copyright, FileMode.Open, FileAccess.Read, FileShare.Read);
            CreateMark(input, _copyright, directory, filename, position);
        }
        
else
        {
            CreateMark(input, copyright, directory 
+   " \\ "   +  filename, position);
        }
    }

    
///   <summary>
    
///  在图片上添加版权信息水印
    
///   </summary>
    
///   <param name="input"> 目标图片 </param>
    
///   <param name="copyright"> 图片版权信息 </param>
    
///   <param name="directory"> 保存目录 </param>
    
///   <param name="filename"> 保存文件名 </param>
    
///   <param name="position"> 水印显示位置 </param>
     public   void  CreateMark(Stream input, Stream copyright,  string  directory,  string  filename, WaterPosition position)
    {
        CreateMark(input, copyright, directory 
+   " \\ "   +  filename, position);
    }

    
///   <summary>
    
///  在图片上添加版权信息水印
    
///   </summary>
    
///   <param name="filepath"> 目标图片路径 </param>
    
///   <param name="copyright"> 版权信息,可以为图片路径或文字版权信息 </param>
    
///   <param name="directory"> 保存目录 </param>
    
///   <param name="filename"> 保存文件名 </param>
    
///   <param name="isDrectory"> copyright是否为文件路径 </param>
    
///   <param name="position"> 水印显示位置 </param>
     public   void  CreateMark( string  filepath,  string  copyright,  string  directory,  string  filename,  bool  isDrectory, WaterPosition position)
    {
        FileStream input 
=   new  FileStream(filepath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
        CreateMark(input, copyright, directory, filename, isDrectory, position);
    }

    
///   <summary>
    
///  在图片上添加版权信息水印
    
///   </summary>
    
///   <param name="filepath"> 目标图片路径 </param>
    
///   <param name="copyright"> 版权信息,可以为图片路径或文字版权信息 </param>
    
///   <param name="savepath"> 保存路径 </param>
    
///   <param name="isDrectory"> copyright是否为文件路径 </param>
    
///   <param name="position"> 水印显示位置 </param>
     public   void  CreateMark( string  filepath,  string  copyright,  string  savepath,  bool  isDrectory, WaterPosition position)
    {
        
if  (isDrectory)
        {
            FileStream input 
=   new  FileStream(filepath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
            FileStream _copyright 
=   new  FileStream(copyright, FileMode.Open, FileAccess.Read, FileShare.Read);
            CreateMark(input, _copyright, savepath, position);
        }
        
else
        {
            FileStream input 
=   new  FileStream(filepath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
            CreateMark(input, copyright, savepath, position);
        }
    }

    
public   void  CreateThumbnailImage(Stream input,  string  savepath)
    {
        
if  (width  ==   0   ||  height  ==   0 )
        {
            input.Close();
            
throw   new  ArgumentException( " 缩略图的宽度和高度不能为0. " );
        }
        Image photo 
=  Image.FromStream(input);

        
if  (isSavePrimaryPic)
        {
            
if  (primaryPicPath  ==   null   ||  primaryPicPath  ==   "" )
            {
                input.Close();
                photo.Dispose();
                
throw   new  ArgumentException( " 当要求保存源图片时,源图片的保存路径不能为空 " );
            }

            
try
            {
                photo.Save(Path.Combine(primaryPicPath, Path.GetFileNameWithoutExtension(savepath) 
+   " .jpg " ), ImageFormat.Jpeg);
            }
            
catch  (Exception ex)
            {
                input.Close();
                photo.Dispose();

                
throw  ex;
            }
        }

        Bitmap markpic 
=   new  Bitmap(photo);

        
if  (ismust)
        {
            
int  twidth, theight;
            
if  (markpic.Width  *  height  >  markpic.Height  *  width)
            {
                twidth 
=  width;
                theight 
=  markpic.Height  *  width  /  markpic.Width;
            }
            
else
            {
                theight 
=  height;
                twidth 
=  markpic.Width  *  height  /  markpic.Height;
            }

            markpic.SetResolution(twidth, theight);
            markpic 
=  (Bitmap)markpic.GetThumbnailImage(twidth, theight,  null new  IntPtr());
        }
        
else
        {
            
if  (width  <  markpic.Width  ||  height  <  markpic.Height)
            {
                
if  (width  <  markpic.Width  ||  height  <  markpic.Height)
                {
                    
int  twidth, theight;
                    
if  (markpic.Width  *  height  >  markpic.Height  *  width)
                    {
                        twidth 
=  width;
                        theight 
=  markpic.Height  *  width  /  markpic.Width;
                    }
                    
else
                    {
                        theight 
=  height;
                        twidth 
=  markpic.Width  *  height  /  markpic.Height;
                    }

                    markpic.SetResolution(twidth, theight);
                    markpic 
=  (Bitmap)markpic.GetThumbnailImage(twidth, theight,  null new  IntPtr());
                }
            }
        }

        
try
        {
            markpic.Save(savepath, ImageFormat.Jpeg);
        }
        
finally
        {
            input.Close();
            photo.Dispose();
            markpic.Dispose();
        }
    }

    
public   void  CreateThumbnailImage( string  source,  string  savepath)
    {
        FileStream input 
=   new  FileStream(source, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
        CreateThumbnailImage(input, savepath);
    }

    
///   <summary>
    
///  水印显示的位置
    
///   </summary>
     public   enum  WaterPosition
    {
        
///   <summary>
        
///  左上
        
///   </summary>
        LeftUp,
        
///   <summary>
        
///  中上
        
///   </summary>
        MiddleUp,
        
///   <summary>
        
///  右上
        
///   </summary>
        RightUp,
        
///   <summary>
        
///  右
        
///   </summary>
        Right,
        
///   <summary>
        
///  右下
        
///   </summary>
        RightDown,
        
///   <summary>
        
///  中下
        
///   </summary>
        MiddleDown,
        
///   <summary>
        
///  左下
        
///   </summary>
        LeftDown,
        
///   <summary>
        
///  左
        
///   </summary>
        Left,
        
///   <summary>
        
///  正中间
        
///   </summary>
        Middle
    }
}


源代码

你可能感兴趣的:(缩略图)