水印及缩略图的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(2550255255)),
            
new RectangleF(xpoint, ypoint, 40030));


        
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.0f0.0f},

                                           
new float[] {0.0f,  1.0f,  0.0f,  0.0f0.0f},

                                           
new float[] {0.0f,  0.0f,  1.0f,  0.0f0.0f},

                                           
new float[] {0.0f,  0.0f,  0.0f,  0.5f0.0f},

                                           
new float[] {0.0f,  0.0f,  0.0f,  0.0f1.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), 00, 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, nullnew 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, nullnew 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, nullnew 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, nullnew 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
    }
}


源代码

原文地址:https://www.cnblogs.com/dsliang/p/1857634.html