当前位置: 代码迷 >> ASP.NET >> 给图片加水印,然后覆盖原来的图片,为什么会报异常呢,
  详细解决方案

给图片加水印,然后覆盖原来的图片,为什么会报异常呢,

热度:4566   发布时间:2013-02-25 00:00:00.0
给图片加水印,然后覆盖原来的图片,为什么会报错误呢,在线等啊!!
下面的代码是我上传图片类,保存的代码
C# code
public void ProcessRequest(HttpContext context)        {            context.Response.ContentType = "text/plain";            context.Response.Charset = "utf-8";            HttpPostedFile file = context.Request.Files["Filedata"];            string uploadPath = HttpContext.Current.Server.MapPath(@context.Request["folder"]) + "\\";            if (file != null)            {                if (!System.IO.Directory.Exists(uploadPath))                {                    System.IO.Directory.CreateDirectory(uploadPath);                }                file.SaveAs(uploadPath + file.FileName);//这里是保存在服务器上,我想就在这句之后给图片加水印                string webFilePath = uploadPath + file.FileName;                string webFilePath_sy = uploadPath + file.FileName;                AddWater(webFilePath, webFilePath_sy);                       context.Response.Write("1");            }            else            {                context.Response.Write("0");            }        }        public bool IsReusable        {            get            {                return false;            }        }


下面是我增加水印的代码
C# code
/// <summary>        /// 在图片上增加文字水印        /// </summary>        /// <param name="Path">原服务器图片路径</param>        /// <param name="Path_sy">生成的带文字水印的图片路径</param>        public static void AddWater(string Path, string Path_sy)        {            string addText = "文字水印";            System.Drawing.Image image = System.Drawing.Image.FromFile(Path);            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);            g.DrawImage(image, 0, 0, image.Width, image.Height);            System.Drawing.Font f = new System.Drawing.Font("Verdana", 60);            System.Drawing.Brush b = new System.Drawing.SolidBrush(System.Drawing.Color.Green);            g.DrawString(addText, f, b, 35, 35);            g.Dispose();            image.Save(Path_sy);            image.Dispose();        }


在上面上传的时候,在image.Save(Path_sy);这句报错,报错GDI一般性错误!
我想原因是保存的时候,覆盖原图片的问题,可能是原图片没有关闭,在线求解决办法啊!!

------解决方案--------------------------------------------------------
给你一段代码吧 懒的去找你的错误了?

C# code
/// <summary>        /// 添加图片水印        /// </summary>        /// <param name="sourcePicture">源图片(绝对路径)</param>        /// <param name="targetPicture">生成图片(绝对路径)</param>        /// <param name="watermarkPicture">水印图片(绝对路径)</param>        /// <param name="watermarkAlpha">水印图片透明度(0.1-1.0数值越小透明度越高)</param>        /// <param name="wipeColor">水印图片中要去除的颜色</param>        /// <param name="watermarkPosition">水印图片位置(从1-9,1:左上;2:中上;3:右上;4:左中;5:正中;6:右中;7:左下;8:中下;9:右下)</param>        public static void MakeImgWatemark(string sourcePicture, string targetPicture, string watermarkPicture, float watermarkAlpha, string wipeColor, int watermarkPosition)        {            Color m_colorWipeColor = new Color();            try            {                m_colorWipeColor = ColorTranslator.FromHtml(wipeColor);            }            catch            {                return;            }            if (sourcePicture == string.Empty || targetPicture == string.Empty || watermarkPicture == string.Empty || watermarkAlpha == 0.0 || watermarkPosition < 1 || watermarkPosition > 9)                return;            string m_sSourceExtension = Path.GetExtension(sourcePicture).ToLower();            string m_sWatermarkExtension = Path.GetExtension(watermarkPicture).ToLower();            if (File.Exists(sourcePicture) == false || File.Exists(watermarkPicture) == false || (m_sSourceExtension != ".gif" && m_sSourceExtension != ".jpg" && m_sSourceExtension != ".png" && m_sSourceExtension != ".bmp") || (m_sWatermarkExtension != ".gif" && m_sWatermarkExtension != ".jpg" && m_sWatermarkExtension != ".png" && m_sWatermarkExtension != ".bmp"))                return;            System.Drawing.Image m_imgSource = System.Drawing.Image.FromFile(sourcePicture);            int m_iSourceWidth = m_imgSource.Width;            int m_iSourceHeight = m_imgSource.Height;            float m_fHorizontalResolution = m_imgSource.HorizontalResolution;            float m_fVerticalResolution = m_imgSource.VerticalResolution;            Bitmap m_bmSource = new Bitmap(m_imgSource, m_iSourceWidth, m_iSourceHeight);            m_imgSource.Dispose();            m_bmSource.SetResolution(m_fHorizontalResolution, m_fVerticalResolution);            m_imgSource.Dispose();            Graphics m_grSource = Graphics.FromImage(m_bmSource);            m_grSource.SmoothingMode = SmoothingMode.AntiAlias;            m_grSource.DrawImage(m_bmSource, new Rectangle(0, 0, m_iSourceWidth, m_iSourceHeight), 0, 0, m_iSourceWidth, m_iSourceHeight, GraphicsUnit.Pixel);            System.Drawing.Image m_imgWatermark = new Bitmap(watermarkPicture);            int m_iWatermarkWidth = m_imgWatermark.Width;            int m_iWatermarkHeight = m_imgWatermark.Height;            Bitmap m_bmWatermark = new Bitmap(m_bmSource);            m_bmWatermark.SetResolution(m_fHorizontalResolution, m_fVerticalResolution);            Graphics m_grWatermark = Graphics.FromImage(m_bmWatermark);            ImageAttributes m_imgAttributes = new ImageAttributes();            ColorMap colorMap = new ColorMap();            colorMap.OldColor = Color.FromArgb(255, m_colorWipeColor);            colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);            ColorMap[] remapTable = { colorMap };            m_imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);            float[][] colorMatrixElements = {            new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f}, // red红色           new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f}, //green绿色           new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f}, //blue蓝色                  new float[] {0.0f,  0.0f,  0.0f,  watermarkAlpha, 0.0f}, //透明度                new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}};//            ColorMatrix m_wmColorMatrix = new ColorMatrix(colorMatrixElements);            m_imgAttributes.SetColorMatrix(m_wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);            int m_iWatermarkX;            int m_iWatermarkY;            switch (watermarkPosition)            {                case 1:                    m_iWatermarkX = 10;                    m_iWatermarkY = 10;                    break;                case 2:                    m_iWatermarkX = (m_iSourceWidth - m_iWatermarkWidth) / 2;                    m_iWatermarkY = 10;                    break;                case 3:                    m_iWatermarkX = m_iSourceWidth - m_iWatermarkWidth - 10;                    m_iWatermarkY = 10;                    break;                case 4:                    m_iWatermarkX = 10;                    m_iWatermarkY = (m_iSourceHeight - m_iWatermarkHeight) / 2;                    break;                case 5:                    m_iWatermarkX = (m_iSourceWidth - m_iWatermarkWidth) / 2;                    m_iWatermarkY = (m_iSourceHeight - m_iWatermarkHeight) / 2;                    break;                case 6:                    m_iWatermarkX = m_iSourceWidth - m_iWatermarkWidth - 10;                    m_iWatermarkY = (m_iSourceHeight - m_iWatermarkHeight) / 2;                    break;                case 7:                    m_iWatermarkX = 10;                    m_iWatermarkY = m_iSourceHeight - m_iWatermarkHeight - 10;                    break;                case 8:                    m_iWatermarkX = (m_iSourceWidth - m_iWatermarkWidth) / 2;                    m_iWatermarkY = m_iSourceHeight - m_iWatermarkHeight - 10;                    break;                case 9:                    m_iWatermarkX = m_iSourceWidth - m_iWatermarkWidth - 10;                    m_iWatermarkY = m_iSourceHeight - m_iWatermarkHeight - 10;                    break;                default:                    m_iWatermarkX = m_iSourceWidth - m_iWatermarkWidth - 10;                    m_iWatermarkY = m_iSourceHeight - m_iWatermarkHeight - 10;                    break;            }            m_grWatermark.DrawImage(m_imgWatermark, new Rectangle(m_iWatermarkX, m_iWatermarkY, m_iWatermarkWidth, m_iWatermarkHeight), 0, 0, m_iWatermarkWidth, m_iWatermarkHeight, GraphicsUnit.Pixel, m_imgAttributes);            m_bmSource = m_bmWatermark;            m_grSource.Dispose();            m_grWatermark.Dispose();            ImageFormat m_imgformatTarget = ImageFormat.Jpeg;            switch (Right(targetPicture, 4).ToLower())            {                case ".gif":                    m_imgformatTarget = ImageFormat.Gif; break;                case ".jpg":                    m_imgformatTarget = ImageFormat.Jpeg; break;                case ".png":                    m_imgformatTarget = ImageFormat.Png; break;                case ".bmp":                    m_imgformatTarget = ImageFormat.Bmp; break;                default:                    m_imgformatTarget = ImageFormat.Jpeg; break;            }            m_bmSource.Save(targetPicture, m_imgformatTarget);            m_bmSource.Dispose();            m_imgWatermark.Dispose();            m_bmWatermark.Dispose();            m_grWatermark.Dispose();            m_grSource.Dispose();            m_imgAttributes.Dispose();        }
  相关解决方案