请选择 进入手机版 | 继续访问电脑版

弘帝企业智能建站系统交流平台

 找回密码
 立即注册
查看: 2435|回复: 0

【C#】图片指定位置添加水印+生成缩略图

[复制链接]
发表于 2017-8-27 07:37:13 | 显示全部楼层 |阅读模式
图片上传函数,进行判断是否加水印,做出两种处理方式:
  /**//// <summary>      
/// 上传图片代码
  /// </summary>  
/// <param name="image_file">HtmlInputFile控件</param>
   /// <param name="ImgPath">存放的文件夹绝对位置</param>  
/// <param name="ImgLink">生成的图片的名称带后缀</param>   
/// <returns></returns>
     public bool UpPic(System.Web.UI.HtmlControls.HtmlInputFile image_file, string ImgPath, string ImgLink)
{
    if (image_file.PostedFile.FileName != null && image_file.PostedFile.FileName.Trim() != "")
    {
        try
        {
            if (!System.IO.Directory.Exists(ImgPath))
            {
                System.IO.Directory.CreateDirectory(ImgPath);
            }
            //生成缩略图
            this.GreateMiniImage((ImgPath + "\\" + "old_" + ImgLink), (ImgPath + "\\" + "mini_" + ImgLink), 50, 50);
            //如果显示水印
            if (ShowWatermark)
            {
                image_file.PostedFile.SaveAs(ImgPath + "\\" + "old_" + ImgLink);
                //加水印
                this.addWaterMark((ImgPath + "\\" + "old_" + ImgLink), (ImgPath + "\\" + ImgLink));
            }
            else
            {
                image_file.PostedFile.SaveAs(ImgPath + "\\" + ImgLink);
            }
            return true;
        }
        catch
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}

加水印的函数如下:
   填加图片函数,需要下面两个函数的支持,当然也可以写到一起,不过那看起来就很冗长了。
        /**//// <summary>
           /// 添加图片水印
           /// </summary>
            /// <param name="oldpath">原图片绝对地址</param>
            /// <param name="newpath">新图片放置的绝对地址</param>
        private void addWaterMark(string oldpath, string newpath)
{
    try
    {
        System.Drawing.Image image = System.Drawing.Image.FromFile(oldpath);
        Bitmap b = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb);
        Graphics g = Graphics.FromImage(b);
        g.Clear(Color.White);
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.InterpolationMode = InterpolationMode.High;
        g.DrawImage(image, 0, 0, image.Width, image.Height);
        if (如果需要填加水印)
        {
            switch (水印类型)
            {
                //是图片的话               
                case "WM_IMAGE":
                    this.addWatermarkImage(g, Page.Server.MapPath(Watermarkimgpath), WatermarkPosition, image.Width, image.Height);
                    break;
                //如果是文字                    
                case "WM_TEXT":
                    this.addWatermarkText(g, WatermarkText, WatermarkPosition
                                               , image.Width, image.Height);
                    break;
            }
            b.Save(newpath);
            b.Dispose();
            image.Dispose();
        }
    }
    catch
    {
        if (File.Exists(oldpath))
        {
            File.Delete(oldpath);
        }
    }
    finally
    {
        if (File.Exists(oldpath))
        {
            File.Delete(oldpath);
        }
    }
}


加水印文字 /**//// <summary>
          ///  加水印文字
          /// </summary>
          /// <param name="picture">imge 对象</param>
          /// <param name="_watermarkText">水印文字内容</param>
          /// <param name="_watermarkPosition">水印位置</param>
          /// <param name="_width">被加水印图片的宽</param>
          /// <param name="_height">被加水印图片的高</param>
          private void addWatermarkText(Graphics picture, string _watermarkText, string _watermarkPosition, int _width, int _height)
{
    int[] sizes = new int[] { 16, 14, 12, 10, 8, 6, 4 };
    Font crFont = null;
    SizeF crSize = new SizeF();
    for (int i = 0; i < 7; i++)
    {
        crFont = new Font("arial", sizes[i], FontStyle.Bold);
        crSize = picture.MeasureString(_watermarkText, crFont);
        if ((ushort)crSize.Width < (ushort)_width)
            break;
    }
    float xpos = 0;
    float ypos = 0;
    switch (_watermarkPosition)
    {
        case "WM_TOP_LEFT":
            xpos = ((float)_width * (float).01) + (crSize.Width / 2);
            ypos = (float)_height * (float).01;
            break;
        case "WM_TOP_RIGHT":
            xpos = ((float)_width * (float).99) - (crSize.Width / 2);
            ypos = (float)_height * (float).01;
            break;
        case "WM_BOTTOM_RIGHT":
            xpos = ((float)_width * (float).99) - (crSize.Width / 2);
            ypos = ((float)_height * (float).99) - crSize.Height;
            break;
        case "WM_BOTTOM_LEFT":
            xpos = ((float)_width * (float).01) + (crSize.Width / 2);
            ypos = ((float)_height * (float).99) - crSize.Height;
            break;
    }
    StringFormat StrFormat = new StringFormat();
    StrFormat.Alignment = StringAlignment.Center;
    SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(153, 0, 0, 0));
    picture.DrawString(_watermarkText, crFont, semiTransBrush2, xpos + 1, ypos + 1, StrFormat);
    SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));
    picture.DrawString(_watermarkText, crFont, semiTransBrush, xpos, ypos, StrFormat);
    semiTransBrush2.Dispose();
    semiTransBrush.Dispose();
}
//代码已经修改,可以按比率还填加图片水印,不过如果背景图片和水印图片太不成比率的话(指水印图片要大于背景图片的1/4),出来的效果不是很好。
水印图片  /**//// <summary>
          ///  加水印图片
          /// </summary>
          /// <param name="picture">imge 对象</param>
          /// <param name="WaterMarkPicPath">水印图片的地址</param>
          /// <param name="_watermarkPosition">水印位置</param>
          /// <param name="_width">被加水印图片的宽</param>
          /// <param name="_height">被加水印图片的高</param>
        private void addWatermarkImage(Graphics picture, string WaterMarkPicPath, string _watermarkPosition, int _width, int _height)
{
    Image watermark = new Bitmap(WaterMarkPicPath);
    ImageAttributes imageAttributes = new ImageAttributes();
    ColorMap colorMap = new ColorMap();
    colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
    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,  0.3f, 0.0f},
                                                new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}
                                           };
    ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
    imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
    int xpos = 0;
    int ypos = 0;
    int WatermarkWidth = 0;
    int WatermarkHeight = 0;
    double bl = 1d;
    //计算水印图片的比率
    //取背景的1/4宽度来比较
    if ((_width > watermark.Width * 4) && (_height > watermark.Height * 4))
    {
        bl = 1;
    }
    else if ((_width > watermark.Width * 4) && (_height < watermark.Height * 4))
    {
        bl = Convert.ToDouble(_height / 4) / Convert.ToDouble(watermark.Height);
    }
    else
     if ((_width < watermark.Width * 4) && (_height > watermark.Height * 4))
    {
        bl = Convert.ToDouble(_width / 4) / Convert.ToDouble(watermark.Width);
    }
    else
    {
        if ((_width * watermark.Height) > (_height * watermark.Width))
        {
            bl = Convert.ToDouble(_height / 4) / Convert.ToDouble(watermark.Height);
        }
        else
        {
            bl = Convert.ToDouble(_width / 4) / Convert.ToDouble(watermark.Width);
        }
    }
    WatermarkWidth = Convert.ToInt32(watermark.Width * bl);
    WatermarkHeight = Convert.ToInt32(watermark.Height * bl);
    switch (_watermarkPosition)
    {
        case "WM_TOP_LEFT":
            xpos = 10;
            ypos = 10;
            break;
        case "WM_TOP_RIGHT":
            xpos = _width - WatermarkWidth - 10;
            ypos = 10;
            break;
        case "WM_BOTTOM_RIGHT":
            xpos = _width - WatermarkWidth - 10;
            ypos = _height - WatermarkHeight - 10;
            break;
        case "WM_BOTTOM_LEFT":
            xpos = 10;
            ypos = _height - WatermarkHeight - 10;
            break;
    }
    picture.DrawImage(watermark, new Rectangle(xpos, ypos, WatermarkWidth, WatermarkHeight), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);
    watermark.Dispose();
    imageAttributes.Dispose();
}

生成缩略图函数
        /**//// <summary>
            /// 生成缩略图
            /// </summary>
            /// <param name="oldpath">原图片地址</param>
            /// <param name="newpath">新图片地址</param>
            /// <param name="tWidth">缩略图的宽</param>
            /// <param name="tHeight">缩略图的高</param>
        private void GreateMiniImage(string oldpath, string newpath, int tWidth, int tHeight)
{
    try
    {
        System.Drawing.Image image = System.Drawing.Image.FromFile(oldpath);
        double bl = 1d;
        if ((image.Width <= image.Height) && (tWidth >= tHeight))
        {
            bl = Convert.ToDouble(image.Height) / Convert.ToDouble(tHeight);
        }
        else if ((image.Width > image.Height) && (tWidth < tHeight))
        {
            bl = Convert.ToDouble(image.Width) / Convert.ToDouble(tWidth);
        }
        else
          if ((image.Width <= image.Height) && (tWidth <= tHeight))
        {
            if (image.Height / tHeight >= image.Width / tWidth)
            {
                bl = Convert.ToDouble(image.Width) / Convert.ToDouble(tWidth);
            }
            else
            {
                bl = Convert.ToDouble(image.Height) / Convert.ToDouble(tHeight);
            }
        }
        else
        {
            if (image.Height / tHeight >= image.Width / tWidth)
            {
                bl = Convert.ToDouble(image.Height) / Convert.ToDouble(tHeight);
            }
            else
            {
                bl = Convert.ToDouble(image.Width) / Convert.ToDouble(tWidth);
            }
        }
        Bitmap b = new Bitmap(image, Convert.ToInt32(image.Width / bl), Convert.ToInt32(image.Height / bl));
        b.Save(newpath);
        b.Dispose();
        image.Dispose();
    }
    catch { }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|弘帝企业智能建站系统 ( 皖ICP备07503252号 )

GMT+8, 2024-4-19 10:27 , Processed in 0.071135 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表