首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

【话说有DBHper、IOHelper,可有ImgHelper?】,该如何解决

2013-01-25 
【话说有DBHper、IOHelper,可有ImgHelper???】前面2个Class几乎天天用。百度和谷歌搜了下,好像针对图片操作的C

【话说有DBHper、IOHelper,可有ImgHelper???】
前面2个Class几乎天天用。百度和谷歌搜了下,好像针对图片操作的Class(这里说ImgHelper)曝光的比较少,比如生成小图啊、水印啊、裁剪啊这些功能

小弟求这方面的Class,一个函数方法也行,我收集大家的,然后整合一下发到论坛给各位使用
【话说有DBHper、IOHelper,可有ImgHelper?】,该如何解决 图片处理的内置类型就已經不错了。 不过还可以进行一下封装。 很简单,看看graphics类型就好了
[解决办法]
有微软自己的webmatrix包里就集合了WebImage工具他就是你要的ImgHelper
[解决办法]
AspJpeg  dll 这个也可以
[解决办法]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

using YDSystem.ZXF.Config;

namespace YDSystem.ZXF.Common.Configurable
{
    /// <summary>
    /// 图像处理帮助类
    /// </summary>
    public class ImageWorker
    {
        //会产生graphics异常的PixelFormat,索引颜色
        private static PixelFormat[] indexedPixelFormats = { 
                                                               PixelFormat.Undefined, 
                                                               PixelFormat.DontCare,
                                                               PixelFormat.Format16bppArgb1555, 
                                                               PixelFormat.Format1bppIndexed, 
                                                               PixelFormat.Format4bppIndexed,
                                                               PixelFormat.Format8bppIndexed


                                                           };

        #region 私有方法
        /// <summary>
        /// 判断图片的PixelFormat 是否在 引发异常的 PixelFormat 之中
        /// </summary>
        /// <param name="imgPixelFormat">原图片的PixelFormat</param>
        /// <returns></returns>
        private static bool IsIndexedPixelFormat(PixelFormat imgPixelFormat)
        {
            foreach (PixelFormat pf in indexedPixelFormats)
            {
                if (pf.Equals(imgPixelFormat)) return true;
            }
            return false;
        }

        /// <summary>
        /// 计算水印的位置
        /// </summary>
        /// <param name="oWidth">源图片宽度</param>
        /// <param name="oHeight">源图片高度</param>
        /// <param name="markWidth">水印图片宽度</param>
        /// <param name="markHeight">鲨鱼图片高度</param>
        /// <returns></returns>
        private static PointF CountWatermarkPosition(YDSystem.ZXF.Config.WatermarkPosition position, int width, int height, int markWidth, int markHeight)
        {
            float padding = 15.0f;  //水印与图片边框间的距离

            PointF point = new PointF();

            //确定水印位置
            switch (position)
            {
                case WatermarkPosition.Center: //居中
                    point.X = (float)((width - markWidth) / 2);
                    point.Y = (float)((height - markHeight) / 2);
                    break;


                case WatermarkPosition.NorthEast: //右上
                    point.X = (float)(width - markWidth - padding);
                    point.Y = padding;
                    break;
                case WatermarkPosition.East: //右中
                    point.X = (float)(width - markWidth - padding);
                    point.Y = (float)((height - markHeight) / 2);
                    break;
                case WatermarkPosition.SouthEast: //右下
                    point.X = (float)(width - markWidth - padding);
                    point.Y = (float)(height - markHeight - padding);
                    break;
                case WatermarkPosition.South: //中下
                    point.X = (float)((width - markWidth) / 2);
                    point.Y = (float)(height - markHeight - padding);
                    break;
                case  WatermarkPosition.SouthWest: //左下
                    point.X = padding;
                    point.Y = (float)(height - markHeight - padding);
                    break;
                case WatermarkPosition.West: //左中
                    point.X = padding;
                    point.Y = (float)((height - markHeight) / 2);
                    break;
                case WatermarkPosition.NorthWest: //左上


                    point.X = padding;
                    point.Y = padding;
                    break;
                case WatermarkPosition.North: //中上
                    point.X = (float)((width - markWidth) / 2);
                    point.Y = padding;
                    break;
            }//switch

            return point;
        }
        #endregion

        /// <summary>
        /// 按指定的配置添加水印
        /// </summary>
        /// <param name="image">待添加水印的图片</param>
        /// <param name="config">指定的YDSystem.ZXF.Config.WatermarkConfigInfo水印配置实例</param>
        public static void AddWatermark(ref Image image, YDSystem.ZXF.Config.WatermarkConfigInfo config)
        {
            if (image == null)  //源图片不存在
            {
                return;
            }

            int height = image.Height;  //原图片高度
            int width = image.Width;    //原图片宽度

            if (IsIndexedPixelFormat(image.PixelFormat)) //索引色图片,必须转化为bitmap进行处理,否则会报异常
            {
                //创建bitmap对象
                Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
                Graphics gr = Graphics.FromImage(bmp);
                gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
                gr.SmoothingMode = SmoothingMode.HighQuality;
                gr.CompositingQuality = CompositingQuality.HighQuality;
                //画到bitmap上


                gr.DrawImage(image, new Rectangle(0, 0, width, height), new Rectangle(0, 0, width, height), GraphicsUnit.Pixel);
                //复制
                image = (Image)bmp.Clone();
                //释放资源
                gr.Dispose();
                bmp.Dispose();
            }

            //创建Graphics对象
            Graphics g = Graphics.FromImage(image);
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.CompositingQuality = CompositingQuality.HighQuality;

            PointF point = new PointF();    //水印位置

            if (config.Type == WatermarkType.Text)  //水印类型是文字
            {
                //创建字体
                Font font = new Font(config.FontName, config.FontSize, config.FontStyle, GraphicsUnit.Pixel);

                //测试字符串高度及宽度
                SizeF textSize = g.MeasureString(config.Text, font);

                //保存字符串宽及高
                int markWidth = (int)textSize.Width;
                int markHeight = (int)textSize.Height;

                //确定水印位置
                point = CountWatermarkPosition(config.Position, width, height, markWidth, markHeight);

                //确定文本颜色
                Color color = Color.FromArgb(Convert.ToInt32(config.FontColor.Substring(1), 16));   //删除颜色#666666前面的“#”
                SolidBrush brush = new SolidBrush(Color.FromArgb(config.Opacity * 255 / 100, color));

                //用白色brush画字符串阴影


                g.DrawString(config.Text, font, new SolidBrush(Color.White), point.X + 1, point.Y + 1);

                //画出字符串
                g.DrawString(config.Text, font, brush, point);

                //释放资源
                g.Dispose();

            }//if
            else    //水印类型是图片
            {
                //获取水印图片
                Image markImage = null;
                ImageAttributes attributes = new ImageAttributes();

                try
                {
                    markImage = Image.FromFile(Utils.MapPath(config.ImagePath));

                    //获取水印图片宽和高
                    int markWidth = markImage.Width;
                    int markHeight = markImage.Height;

                    //确定水印位置
                    point = CountWatermarkPosition(config.Position, width, height, markWidth, markHeight);

                    //透明水印
                    float[][] colorMatrixParam = {
                                                   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,config.Opacity * 1.0f / 100,0.0f},  //透明度
                                                   new float[] {0.0f,0.0f,0.0f,0.0f,1.0f}
                                                 };

                    ColorMatrix colorMatrix = new ColorMatrix(colorMatrixParam);

                    //重设图像属性
                    attributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

                    //铬上水印
                    g.DrawImage(markImage, new Rectangle((int)point.X, (int)point.Y, markWidth, markHeight), 0, 0, markWidth, markHeight, GraphicsUnit.Pixel, attributes);
                }
                catch (Exception ex)
                {
                    Utils.ShowAdminError("水印图片不存在", ex.Message);
                }
                finally
                {
                    //释放资源
                    attributes.Dispose();
                    markImage.Dispose();
                    g.Dispose();
                }

            }//else
        }

        /// <summary>
        /// 按默认的水印配置添加水印
        /// </summary>
        /// <param name="image">待添加水印的图片实例</param>


        public static void AddDefaultWatermark(ref Image image)
        {
            AddWatermark(ref image, GlobalConfigManage.LoadConfig().WatermarkSettings);
        }

        /// <summary>
        /// 按默认的水印配置添加水印
        /// </summary>
        /// <param name="image">待添加水印的图片实例</param>
        public static void AddArticleWatermark(ref Image image)
        {
            WatermarkConfigInfo config = null;
            if (GlobalConfigManage.LoadConfig().UseDefaultWatermarkFirst) //默认配置优先
            {
                config = GlobalConfigManage.LoadConfig().WatermarkSettings;
            }
            else
            {
                config = ArticleConfigManage.LoadConfig().WatermarkSettings;
            }
            AddWatermark(ref image, config);
        }

热点排行