• 水印及缩略图的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
        }
    }


    源代码

  • 相关阅读:
    Scala Partial Function从官方文档解析
    Scala Option 从官方DOC解析
    Scala Nothing 从官方DOC翻译
    从HTTP request的body中拿到JSON并反序列化为一个对象
    将一个大文件分割成若干个小文件,每个文件最多10万行
    java 可变长度参数列表
    java Class类的用法示例
    java String int转换的不同方法
    转载:大公司与小公司的比较
    java 判断5张牌的组成
  • 原文地址:https://www.cnblogs.com/dsliang/p/1857634.html
Copyright © 2020-2023  润新知