通用类 ImagesHelper 图片操作:生成缩略图、添加水印、截取图片等

/// <summary>
    /// 图片操作:生成缩略图、添加水印、截取图片等
    /// </summary>
    public class ImagesHelper
    {

       

        /// <summary>
        /// 根据文件流获得图片宽度
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public static int getImgWidth(Stream stream)
        {           
            Image img = Image.FromStream(stream);
            int result = img.Width;
            img.Dispose();
            stream.Dispose();
            return result;
        }

        /// <summary>
        /// 根据图片路径获得图片宽度
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public static int getImgWidth(string filePath)
        {            
            Image img = Image.FromFile(filePath);
            int result = img.Width;
            img.Dispose();
            return result;
        }
       

        #region 从文件流生成缩略图
        /// <summary>
        /// 从文件流生成缩略图
        /// </summary>
        /// <param name="stream">数据IO流</param>
        /// <param name="savePath"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="scale"></param>
        /// <returns></returns>
        public static bool GetThumbNail(Stream stream, string savePath, int width, int height, ThumbNailScale scale)
        {
            //缩略图
            Image img = Image.FromStream(stream);
            stream.Dispose();
            int towidth = width;
            int toheight = height;
            int x = 0;
            int y = 0;
            int ow = img.Width;
            int oh = img.Height;
            //如果图片小于指定宽度
            if (ow < width)
                width = ow;

            if (oh < height)
                height = oh;


            switch (scale)
            {
                case ThumbNailScale.Appointed:
                    break;
                case ThumbNailScale.ScaleWidth:
                    toheight = img.Height * width / img.Width;
                    break;
                case ThumbNailScale.ScaleHeight:
                    towidth = img.Width * height / img.Height;
                    break;
                case ThumbNailScale.Cut:
                    if ((double)img.Width / (double)img.Height > (double)towidth / (double)toheight)
                    {
                        oh = img.Height;
                        ow = img.Height * towidth / toheight;
                        y = 0;
                        x = (img.Width - ow) / 2;
                    }
                    else
                    {
                        ow = img.Width;
                        oh = img.Width * height / towidth;
                        x = 0;
                        y = (img.Height - oh) / 2;
                    }
                    break;
                case ThumbNailScale.ScaleDown:
                    double Tw, Th;
                    Tw = width;
                    Th = height * (Convert.ToDouble(oh) / Convert.ToDouble(ow));
                    if (Th > height)
                    {
                        Th = height;
                        Tw = width * (Convert.ToDouble(ow) / Convert.ToDouble(oh));
                    }
                    towidth = Convert.ToInt32(Tw);
                    toheight = Convert.ToInt32(Th);
                    break;
                default:
                    break;
            }

            //新建一个bmp图片
            Image bitmap = new Bitmap(towidth, toheight);

            //新建一个画板
            Graphics g = Graphics.FromImage(bitmap);

            //设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            //清空画布并以透明背景色填充
            g.Clear(Color.Transparent);


            //在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(img, new Rectangle(0, 0, towidth, toheight),
                new Rectangle(x, y, ow, oh),
                GraphicsUnit.Pixel);

            try
            {
                //以jpg格式保存缩略图
                bitmap.Save(savePath, ImageFormat.Jpeg);
            }
            catch (Exception ex)
            {
                Logger.Write(string.Format("从文件流生成缩略图:{0}", ex.Message), Logger.MsgType.Error);
                return false;
            }
            finally
            {
                img.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }

            return true;
        }
        #endregion

        #region 从文件路径生成缩略图
        /// <summary>
        /// 从图片路径生成缩略图
        /// </summary>
        /// <param name="originalImagePath">图片路径</param>
        /// <param name="savePath">保存路径</param>
        /// <param name="width">缩略图宽度</param>
        /// <param name="height">缩略图高度</param>
        /// <param name="mode">HW:指定高宽缩放(可能变形) W://指定宽,高按比例 H://指定高,宽按比例 Cut://指定高宽裁减(不变形) </param>
        /// <returns></returns>
        public static bool GetThumbNail(string originalImagePath, string savePath, int width, int height, ThumbNailScale scale)
        {
            //缩略图
            Image img = Image.FromFile(originalImagePath);

            int towidth = width;
            int toheight = height;

            int x = 0;
            int y = 0;
            int ow = img.Width;
            int oh = img.Height;

            //如果图片小于指定宽度
            if (ow < width)
                width = ow;

            switch (scale)
            {
                case ThumbNailScale.Appointed:
                    break;
                case ThumbNailScale.ScaleWidth:
                    toheight = img.Height * width / img.Width;
                    break;
                case ThumbNailScale.ScaleHeight:
                    towidth = img.Width * height / img.Height;
                    break;
                case ThumbNailScale.Cut:
                    if ((double)img.Width / (double)img.Height > (double)towidth / (double)toheight)
                    {
                        oh = img.Height;
                        ow = img.Height * towidth / toheight;
                        y = 0;
                        x = (img.Width - ow) / 2;
                    }
                    else
                    {
                        ow = img.Width;
                        oh = img.Width * height / towidth;
                        x = 0;
                        y = (img.Height - oh) / 2;
                    }
                    break;
                case ThumbNailScale.ScaleDown:
                    double Tw, Th;
                    Tw = width;
                    Th = height * (Convert.ToDouble(oh) / Convert.ToDouble(ow));
                    if (Th > height)
                    {
                        Th = height;
                        Tw = width * (Convert.ToDouble(ow) / Convert.ToDouble(oh));
                    }
                    towidth = Convert.ToInt32(Tw);
                    toheight = Convert.ToInt32(Th);
                    break;
                default:
                    break;
            }

            //新建一个bmp图片
            Image bitmap = new Bitmap(towidth, toheight);

            //新建一个画板
            Graphics g = Graphics.FromImage(bitmap);

            //设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            //清空画布并以透明背景色填充
            g.Clear(Color.White);

            //在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(img, new Rectangle(0, 0, towidth, toheight),
                new Rectangle(x, y, ow, oh),
                GraphicsUnit.Pixel);

            try
            {
                //以jpg格式保存缩略图
                bitmap.Save(savePath, ImageFormat.Jpeg);
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                img.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }

            return true;

        }
        #endregion

        #region 获取图片格式
        /// <summary>
        /// 获取图片格式
        /// </summary>
        /// <param name="strContentType"></param>
        /// <returns>返回图片格式</returns>
        public static ImageFormat GetImageType(object strContentType)
        {
            if ((strContentType.ToString().ToLower()) == "image/pjpeg")
            {
                return ImageFormat.Jpeg;
            }
            else if ((strContentType.ToString().ToLower()) == "image/gif")
            {
                return ImageFormat.Gif;
            }
            else if ((strContentType.ToString().ToLower()) == "image/bmp")
            {
                return ImageFormat.Bmp;
            }
            else if ((strContentType.ToString().ToLower()) == "image/tiff")
            {
                return ImageFormat.Tiff;
            }
            else if ((strContentType.ToString().ToLower()) == "image/x-icon")
            {
                return ImageFormat.Icon;
            }
            else if ((strContentType.ToString().ToLower()) == "image/x-png")
            {
                return ImageFormat.Png;
            }
            else if ((strContentType.ToString().ToLower()) == "image/x-emf")
            {
                return ImageFormat.Emf;
            }
            else if ((strContentType.ToString().ToLower()) == "image/x-exif")
            {
                return ImageFormat.Exif;
            }
            else if ((strContentType.ToString().ToLower()) == "image/x-wmf")
            {
                return ImageFormat.Wmf;
            }
            else
            {
                return ImageFormat.MemoryBmp;
            }
        }
        #endregion

        /// <summary>
        /// 生成水印图片
        /// </summary>
        /// <param name="sourceFile"></param>
        /// <param name="saveFile">保存文件路径</param>
        /// <returns></returns>
        public static bool MakeWaterImage(Stream sourceFile, string saveFile)
        {
            bool result = false;
            //水印图片
            try
            {
                Image imgPhoto = Image.FromStream(sourceFile);
                sourceFile.Close();
                sourceFile.Dispose();

                int phWidth = imgPhoto.Width;
                int phHeight = imgPhoto.Height;

                Bitmap bmPhoto = new Bitmap(phWidth, phHeight, PixelFormat.Format24bppRgb);
                bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

                Image imgWatermark = new Bitmap(System.Web.HttpContext.Current.Server.MapPath("/images/watermark.png"));
                int wmWidth = imgWatermark.Width;
                int wmHeight = imgWatermark.Height;

                if (phWidth > (wmWidth + 100) && phHeight > (wmHeight + 100))
                {
                    Graphics grPhoto = Graphics.FromImage(bmPhoto);
                    grPhoto.Clear(Color.White);
                    grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, phWidth, phHeight), 0, 0, phWidth, phHeight, GraphicsUnit.Pixel);

                    grPhoto.Dispose();

                    //添加水印图片

                    using (Bitmap bmWatermark = new Bitmap(bmPhoto))
                    {
                        bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);
                        Graphics grWatermark = Graphics.FromImage(bmWatermark);
                        using (ImageAttributes imageAttributes = new ImageAttributes())
                        {
                            //ColorMap colorMap = new ColorMap();
                            //colorMap.OldColor = Color.FromArgb(255, 255, 255,255);
                            //colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
                            //ColorMap[] remapTable = { colorMap };
                            //imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
                            float[][] colorMatrixElements = { 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, 1.0f, 0.0f }, new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } };
                            ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
                            imageAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
                            int xPosOfWm = ((phWidth - wmWidth) - 2);
                            int yPosOfWm = ((phHeight - wmHeight) - 2);
                            grWatermark.DrawImage(imgWatermark, new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight), 0, 0, wmWidth, wmHeight, GraphicsUnit.Pixel, imageAttributes);
                        }
                        imgPhoto = bmWatermark;
                        grWatermark.Dispose();
                        imgPhoto.Save(saveFile, ImageFormat.Jpeg);
                    }

                    result = true;
                }
                else
                {
                    result = false;
                }
                imgWatermark.Dispose();
                bmPhoto.Dispose();
                imgPhoto.Dispose();
            }
            catch(Exception ex)
            {
                Logger.Write(string.Format("生成水印图片错误:{0}",ex.Message), Logger.MsgType.Information);

                try
                {
                    Image imgPhoto2 = Image.FromStream(sourceFile);
                    imgPhoto2.Save(saveFile, ImageFormat.Jpeg);
                    imgPhoto2.Dispose();
                    result = true;
                }
                catch
                {
                    result = false;
                }
            }

            return result;

        }

        /// <summary>
        /// 生成水印图片
        /// </summary>
        /// <param name="sourceFile"></param>
        /// <param name="saveFile">保存文件路径</param>
        /// <param name="Location">位置 0 - 右下角 1 -  居中 2 - 右上角 3 - 左下角</param>
        /// <returns></returns>
        public static bool MakeWaterImage(Stream sourceFile, string saveFile, ImagePosition Position)
        {
            bool result = false;
            //水印图片
            try
            {
                Image imgPhoto = Image.FromStream(sourceFile);


                int phWidth = imgPhoto.Width;
                int phHeight = imgPhoto.Height;

                Bitmap bmPhoto = new Bitmap(phWidth, phHeight, PixelFormat.Format24bppRgb);
                bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

                Image imgWatermark = new Bitmap(System.Web.HttpContext.Current.Server.MapPath("/images/watermark.png"));
                int wmWidth = imgWatermark.Width;
                int wmHeight = imgWatermark.Height;

                if (phWidth > (wmWidth + 100) && phHeight > (wmHeight + 100))
                {
                    Graphics grPhoto = Graphics.FromImage(bmPhoto);
                    grPhoto.Clear(Color.White);
                    grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, phWidth, phHeight), 0, 0, phWidth, phHeight, GraphicsUnit.Pixel);

                    grPhoto.Dispose();

                    //添加水印图片

                    using (Bitmap bmWatermark = new Bitmap(bmPhoto))
                    {
                        bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);
                        Graphics grWatermark = Graphics.FromImage(bmWatermark);
                        using (ImageAttributes imageAttributes = new ImageAttributes())
                        {
                            //ColorMap colorMap = new ColorMap();
                            //colorMap.OldColor = Color.FromArgb(255, 255, 255,255);
                            //colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
                            //ColorMap[] remapTable = { colorMap };
                            //imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
                            float[][] colorMatrixElements = { 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, 1.0f, 0.0f }, new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } };
                            ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
                            imageAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
                            int xPosOfWm = 0;
                            int yPosOfWm = 0;
                            switch (Position)
                            {
                                case ImagePosition.BottomRight:
                                    xPosOfWm = ((phWidth - wmWidth) - 2);
                                    yPosOfWm = ((phHeight - wmHeight) - 2);
                                    break;
                                case ImagePosition.TopLeft:
                                    xPosOfWm = 2;
                                    yPosOfWm = 2;
                                    break;
                                case ImagePosition.TopRigth:
                                    xPosOfWm = ((phWidth - wmWidth) - 2);
                                    yPosOfWm = 2;
                                    break;
                                case ImagePosition.BottomLeft:
                                    xPosOfWm = 2;
                                    yPosOfWm = ((phHeight - wmHeight) - 2);
                                    break;
                                case ImagePosition.Center:
                                    xPosOfWm = ((phWidth / 2) - (wmWidth / 2));
                                    yPosOfWm = ((phHeight / 2) - (wmHeight / 2));
                                    break;
                            }
                            grWatermark.DrawImage(imgWatermark, new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight), 0, 0, wmWidth, wmHeight, GraphicsUnit.Pixel, imageAttributes);
                        }
                        imgPhoto = bmWatermark;
                        grWatermark.Dispose();
                        imgPhoto.Save(saveFile, ImageFormat.Jpeg);
                    }

                    result = true;
                }
                else
                {
                    Image imgPhoto2 = Image.FromStream(sourceFile);
                    imgPhoto2.Save(saveFile, ImageFormat.Jpeg);
                    imgPhoto2.Dispose();
                    result = true;
                }
                imgWatermark.Dispose();
                bmPhoto.Dispose();
                imgPhoto.Dispose();
            }
            catch
            {

                try
                {
                    Image imgPhoto2 = Image.FromStream(sourceFile);
                    imgPhoto2.Save(saveFile, ImageFormat.Jpeg);
                    imgPhoto2.Dispose();
                    result = true;
                }
                catch
                {
                    result = false;
                }
            }

            sourceFile.Close();
            sourceFile.Dispose();

            return result;

        }

        #region 从图片中截取一张指定大小的图片
        /// <summary>
        /// 从图片中截取部分生成新图
        /// </summary>
        /// <param name="sFromFilePath">原始图片</param>
        /// <param name="saveFilePath">生成新图</param>
        /// <param name="width">截取图片宽度</param>
        /// <param name="height">截取图片高度</param>
        /// <param name="spaceX">截图图片X坐标</param>
        /// <param name="spaceY">截取图片Y坐标</param>
        public static void CaptureImage(string sFromFilePath, string saveFilePath, int width, int height, int spaceX, int spaceY)
        {
            //载入底图
            Image fromImage = Image.FromFile(sFromFilePath);
            int x = 0; //截取X坐标
            int y = 0; //截取Y坐标
            //原图宽与生成图片宽 之差
            //当小于0(即原图宽小于要生成的图)时,新图宽度为较小者 即原图宽度 X坐标则为0
            //当大于0(即原图宽大于要生成的图)时,新图宽度为设置值 即width X坐标则为 sX与spaceX之间较小者
            //Y方向同理
            int sX = fromImage.Width - width;
            int sY = fromImage.Height - height;
            if (sX > 0)
            {
                x = sX > spaceX ? spaceX : sX;
            }
            else
            {
                width = fromImage.Width;
            }
            if (sY > 0)
            {
                y = sY > spaceY ? spaceY : sY;
            }
            else
            {
                height = fromImage.Height;
            }

            //创建新图位图
            Bitmap bitmap = new Bitmap(width, height);
            //创建作图区域
            Graphics graphic = Graphics.FromImage(bitmap);
            //截取原图相应区域写入作图区
            graphic.DrawImage(fromImage, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
            //从作图区生成新图
            Image saveImage = Image.FromHbitmap(bitmap.GetHbitmap());
            //保存图象
            saveImage.Save(saveFilePath, ImageFormat.Jpeg);
            //释放资源
            saveImage.Dispose();
            bitmap.Dispose();
            graphic.Dispose();
        }
        #endregion

        public enum ImagePosition
        {
            /// <summary>
            /// 居中
            /// </summary>
            Center,
            /// <summary>
            /// 左上角
            /// </summary>
            TopLeft,
            /// <summary>
            /// 左下角
            /// </summary>
            BottomLeft,
            /// <summary>
            /// 右下角
            /// </summary>
            BottomRight,
            /// <summary>
            /// 右上角
            /// </summary>
            TopRigth
        }

        /// <summary>
        /// 图片
        /// </summary>
        public enum ThumbNailScale
        {
            /// <summary>
            /// 指定高宽缩放,图片长宽不一致会变形
            /// </summary>
            Appointed,
            /// <summary>
            /// 指定宽,高按比例    
            /// </summary>
            ScaleWidth,
            /// <summary>
            /// 指定高,宽按比例
            /// </summary>
            ScaleHeight,
            /// <summary>
            /// 指定高宽裁减,可能只显示部分图片
            /// </summary>
            Cut,
            /// <summary>
            /// 按图片比例缩放,不变形,显示全部图片(推荐)
            /// </summary>
            ScaleDown
        }
    }

 

posted @ 2012-08-29 15:58  暗尘掩月  阅读(208)  评论(0编辑  收藏  举报