ImageHelper

#region << 版 本 注 释 >>
/****************************************************
* 文 件 名:EncryptHelper
* Copyright(c) www.ITdos.com
* CLR 版本: 4.0.30319.17929
* 创 建 人:ITdos
* 电子邮箱:admin@itdos.com
* 创建日期:2010/04/01 11:00:49
* 文件描述:
******************************************************
* 修 改 人:
* 修改日期:
* 备注描述:
*******************************************************/
#endregion

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

namespace GT.Common.Helper
{
    /// <summary>
    /// 图片水印处理类
    /// </summary>
    public class ImageHelper
    {
        /// <summary>
        /// 生成缩略图的模式, WH-指定宽高缩放(可能变形) W-指定宽,高按比例  H-指定高,宽按比例 CUT-指定高宽裁减(不变形,推荐用这个)。
        /// </summary>
        public enum ThumbnailModeOption : byte
        {
            /// <summary>
            /// 指定宽高缩放(可能变形)
            /// </summary>
            WH,
            /// <summary>
            /// 指定宽,高按比例
            /// </summary>
            W,
            /// <summary>
            /// 指定高,宽按比例
            /// </summary>
            H,
            /// <summary>
            /// 指定高宽裁减(不变形,推荐用这个)
            /// </summary>
            CUT
        }

        /// <summary>
        /// 加图片水印的位置,TopLeft-左上角 TopCenter-上中间 TopRight-右上角 BottomLeft-左下角 BottomCenter-下中间 右下角-右下角 Middle-正中间。
        /// </summary>
        public enum WaterPositionOption : byte
        {
            /// <summary>
            /// 左上角
            /// </summary>
            LeftTop,
            /// <summary>
            /// 上中间
            /// </summary>
            CenterTop,
            /// <summary>
            /// 右上角
            /// </summary>
            RightTop,
            /// <summary>
            /// 左下角
            /// </summary>
            LeftBottom,
            /// <summary>
            /// 下中间
            /// </summary>
            CenterBottom,
            /// <summary>
            /// 右下角
            /// </summary>
            RightBottom,
            /// <summary>
            /// 正中间
            /// </summary>
            Middle
        }

        /// <summary>
        /// 获取图片格式。
        /// </summary>
        /// <Param name="fileName">文件名</Param>
        /// <returns></returns>
        public static ImageFormat GetImageFormat(string fileName)
        {
            string extension = fileName.Substring(fileName.LastIndexOf(".")).Trim().ToLower();

            switch (extension)
            {
                case ".jpg":
                    return System.Drawing.Imaging.ImageFormat.Jpeg;
                case ".jpeg":
                    return System.Drawing.Imaging.ImageFormat.Jpeg;
                case ".gif":
                    return System.Drawing.Imaging.ImageFormat.Gif;
                case ".png":
                    return System.Drawing.Imaging.ImageFormat.Png;
                case ".bmp":
                    return System.Drawing.Imaging.ImageFormat.Bmp;
                case ".ico":
                    return System.Drawing.Imaging.ImageFormat.Icon;
                default:
                    goto case ".jpg";
            }
        }

        /// <summary>
        /// 加水印图片并保存。
        /// </summary>
        /// <Param name="originalImageStream">Stream</Param>
        /// <Param name="strFileName">源图路径(物理路径)</Param>
        /// <Param name="savePath">图片保存路径(物理路径)</Param>
        /// <Param name="waterPath">水印图路径(物理路径)</Param>
        /// <Param name="edge">水印图离原图边界的距离</Param>
        /// <Param name="position">加图片水印的位置</Param>
        /// <returns>是否成功</returns>
        public static bool MakeWaterImage(Stream originalImageStream, string strFileName, string savePath, string waterPath, int edge, WaterPositionOption position)
        {
            bool success = false;

            int x = 0;
            int y = 0;
            Image waterImage = null;
            Image image = null;
            Bitmap bitmap = null;
            Graphics graphics = null;

            try
            {
                //加载原图
                image = Image.FromStream(originalImageStream);
                //加载水印图
                waterImage = Image.FromFile(waterPath);
                bitmap = new Bitmap(image);
                graphics = Graphics.FromImage(bitmap);

                int newEdge = edge;
                if (newEdge >= image.Width + waterImage.Width) newEdge = 10;

                switch (position)
                {
                    case WaterPositionOption.LeftTop:
                        x = newEdge;
                        y = newEdge;
                        break;
                    case WaterPositionOption.CenterTop:
                        x = (image.Width - waterImage.Width) / 2;
                        y = newEdge;
                        break;
                    case WaterPositionOption.RightTop:
                        x = image.Width - waterImage.Width - newEdge;
                        y = newEdge;
                        break;
                    case WaterPositionOption.LeftBottom:
                        x = newEdge;
                        y = image.Height - waterImage.Height - newEdge;
                        break;
                    case WaterPositionOption.CenterBottom:
                        x = (image.Width - waterImage.Width) / 2;
                        y = image.Height - waterImage.Height - newEdge;
                        break;
                    case WaterPositionOption.RightBottom:
                        x = image.Width - waterImage.Width - newEdge;
                        y = image.Height - waterImage.Height - newEdge;
                        break;
                    case WaterPositionOption.Middle:
                        x = (image.Width - waterImage.Width) / 2;
                        y = (image.Height - waterImage.Height) / 2;
                        break;
                    default:
                        goto case WaterPositionOption.RightBottom;
                }

                // 画水印图片
                graphics.DrawImage(waterImage, new Rectangle(x, y, waterImage.Width, waterImage.Height), 0, 0, waterImage.Width, waterImage.Height, GraphicsUnit.Pixel);

                // 关闭打开着的文件并保存(覆盖)新图片
                originalImageStream.Close();
                bitmap.Save(savePath, GetImageFormat(strFileName));

                success = true;
            }
            catch (Exception ex)
            {
                success = false;
                throw;
                //throw new Exception(ex.Message.Replace("'", " ").Replace("\n", " ").Replace("\\", "/"));
            }
            finally
            {
                if (graphics != null) graphics.Dispose();
                if (bitmap != null) bitmap.Dispose();
                if (image != null) image.Dispose();
                if (waterImage != null) waterImage.Dispose();
            }

            return success;
        }

        /// <summary>
        /// 生成缩略图并保存。
        /// </summary>
        /// <Param name="originalImageStream">Stream</Param>
        /// <Param name="strFileName">源图路径(物理路径)</Param>
        /// <Param name="thumbnailPath">缩略图路径(物理路径)</Param>
        /// <Param name="maxWidth">缩略图最大宽度</Param>
        /// <Param name="maxheight">缩略图最大高度</Param>
        /// <Param name="mode">生成缩略图的方式</Param>
        /// <returns>是否成功</returns>
        public static bool MakeThumbnail(Stream originalImageStream, string strFileName, string thumbnailPath, int maxWidth, int maxheight, ThumbnailModeOption mode)
        {
            bool success = false;

            int x = 0;
            int y = 0;
            int toW = maxWidth;
            int toH = maxheight;
            Image image = null;
            Image bitmap = null;
            Graphics graphics = null;
            try
            {
                image = Image.FromStream(originalImageStream);
                int w = image.Width;
                int h = image.Height;

                switch (mode)
                {
                    case ThumbnailModeOption.WH:
                        break;
                    case ThumbnailModeOption.W:
                        if (w < maxWidth)
                        {
                            toW = w;
                            toH = h;
                        }
                        else
                        {
                            toH = h * maxWidth / w;
                        }
                        break;
                    case ThumbnailModeOption.H:
                        if (h < maxheight)
                        {
                            toW = w;
                            toH = h;
                        }
                        else
                        {
                            toW = w * maxheight / h;
                        }
                        break;
                    case ThumbnailModeOption.CUT:
                        if (((double)w / (double)h) > ((double)toW / (double)toH))
                        {
                            w = h * toW / toH;
                            y = 0;
                            x = (image.Width - w) / 2;
                        }
                        else
                        {
                            h = w * toH / toW;
                            x = 0;
                            y = (image.Height - h) / 2;
                        }
                        break;
                    default:
                        goto case ThumbnailModeOption.CUT;
                }

                bitmap = new Bitmap(toW, toH);
                graphics = Graphics.FromImage(bitmap);
                graphics.InterpolationMode = InterpolationMode.High;   //设置高质量,低速度呈现平滑程度
                graphics.SmoothingMode = SmoothingMode.HighQuality;    //清空画布并以透明背景色填充
                graphics.Clear(Color.Transparent);

                // 在指定位置并且按指定大小绘制原图片的指定部分
                graphics.DrawImage(image, new Rectangle(0, 0, toW, toH), new Rectangle(x, y, w, h), GraphicsUnit.Pixel);
                // 保存缩略图
                bitmap.Save(thumbnailPath, GetImageFormat(strFileName));
                success = true;
            }
            catch (Exception ex)
            {
                success = false;
                throw;
            }
            finally
            {
                if (graphics != null) graphics.Dispose();
                if (bitmap != null) bitmap.Dispose();
                if (image != null) image.Dispose();
            }
            return success;
        }
        /// <summary>
        /// 生成缩略图并打水印再保存。
        /// </summary>
        /// <Param name="originalImageStream">Stream</Param>
        /// <Param name="strFileName">源图路径(物理路径)</Param>
        /// <Param name="thumbnailPath">缩略图路径(物理路径)</Param>
        /// <Param name="maxWidth">缩略图最大宽度</Param>
        /// <Param name="maxheight">缩略图最大高度</Param>
        /// <Param name="mode">生成缩略图的方式</Param>
        /// <Param name="waterPath">水印图路径(物理路径)</Param>
        /// <Param name="edge">水印图离原图边界的距离</Param>
        /// <Param name="position">加图片水印的位置</Param>
        /// <returns>是否成功</returns>
        public static bool MakeThumbnailWater(Stream originalImageStream, string strFileName, string thumbnailPath, int maxWidth, int maxheight, ThumbnailModeOption mode, string waterPath, int edge, WaterPositionOption position)
        {
            bool success = false;
            try
            {
                // 生成缩略图
                MakeThumbnail(originalImageStream, strFileName, thumbnailPath, maxWidth, maxheight, mode);
                Stream stream = File.Open(thumbnailPath, FileMode.Open);
                //打水印
                MakeWaterImage(stream, strFileName, thumbnailPath, waterPath, edge, position);
                success = true;
            }
            catch (Exception ex)
            {
                success = false;
                throw;
            }
            return success;
        }
    }
}

 

posted @ 2019-09-02 14:22  萌橙  阅读(209)  评论(0编辑  收藏  举报