Discuz!NT 2.6给图片添加水印的两个方法

//using System.Drawing;
//using System.Drawing.Drawing2D;
//using System.Drawing.Imaging;

/// <summary>
/// 添加图片水印
/// </summary>
/// <param name="img">要加水印的图片</param>
/// <param name="filename">保存路径</param>
/// <param name="watermarkFilename">水印图片路径</param>
/// <param name="watermarkStatus">水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中 5=中央 6=右中 7=左下 8=中下 9=右下</param>
/// <param name="quality">质量,0-100</param>
/// <param name="watermarkTransparency">透明度 1--10 10为不透明</param>
public static void AddImageSignPic(Image img, string filename, string watermarkFilename, int watermarkStatus, int quality, int watermarkTransparency)
{
    Graphics g = Graphics.FromImage(img);
    //设置高质量插值法
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
    //设置高质量,低速度呈现平滑程度
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    Image watermark = new Bitmap(watermarkFilename);

    if (watermark.Height >= img.Height || watermark.Width >= img.Width)
    {
        return;
    }

    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 transparency = 0.5F;
    if (watermarkTransparency >= 1 && watermarkTransparency <= 10)
    {
        transparency = (watermarkTransparency / 10.0F);
    }

    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,  transparency, 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;

    switch (watermarkStatus)
    {
        case 1:
            xpos = (int)(img.Width * (float).01);
            ypos = (int)(img.Height * (float).01);
            break;
        case 2:
            xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));
            ypos = (int)(img.Height * (float).01);
            break;
        case 3:
            xpos = (int)((img.Width * (float).99) - (watermark.Width));
            ypos = (int)(img.Height * (float).01);
            break;
        case 4:
            xpos = (int)(img.Width * (float).01);
            ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));
            break;
        case 5:
            xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));
            ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));
            break;
        case 6:
            xpos = (int)((img.Width * (float).99) - (watermark.Width));
            ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));
            break;
        case 7:
            xpos = (int)(img.Width * (float).01);
            ypos = (int)((img.Height * (float).99) - watermark.Height);
            break;
        case 8:
            xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));
            ypos = (int)((img.Height * (float).99) - watermark.Height);
            break;
        case 9:
            xpos = (int)((img.Width * (float).99) - (watermark.Width));
            ypos = (int)((img.Height * (float).99) - watermark.Height);
            break;
    }

    //g.DrawImage(watermark, new Rectangle(xpos, ypos, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);
    g.DrawImage(watermark, new System.Drawing.Rectangle(xpos, ypos, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, System.Drawing.GraphicsUnit.Pixel);

    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
    ImageCodecInfo ici = null;
    foreach (ImageCodecInfo codec in codecs)
    {
        if (codec.MimeType.IndexOf("jpeg") > -1)
        {
            ici = codec;
        }
    }
    EncoderParameters encoderParams = new EncoderParameters();
    long[] qualityParam = new long[1];
    if (quality < 0 || quality > 100)
    {
        quality = 80;
    }
    qualityParam[0] = quality;

    EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);
    encoderParams.Param[0] = encoderParam;

    if (ici != null)
    {
        img.Save(filename, ici, encoderParams);
    }
    else
    {
        img.Save(filename);
    }

    g.Dispose();
    img.Dispose();
    watermark.Dispose();
    imageAttributes.Dispose();
}


/// <summary>
/// 添加文字水印
/// </summary>
/// <param name="img">要加水印的图片</param>
/// <param name="filename">保存路径</param>
/// <param name="watermarkText">水印文本</param>
/// <param name="watermarkStatus">水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中 5=中央 6=右中 7=左下 8=中下 9=右下</param>
/// <param name="quality">质量,0-100</param>
/// <param name="fontname">字体</param>
/// <param name="fontsize">大小</param>
public static void AddImageSignText(Image img, string filename, string watermarkText, int watermarkStatus, int quality, string fontname, int fontsize)
{
    //System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(img);
    //    .FromFile(filename);
    Graphics g = Graphics.FromImage(img);
    Font drawFont = new Font(fontname, fontsize, FontStyle.Regular, GraphicsUnit.Pixel);
    SizeF crSize;
    crSize = g.MeasureString(watermarkText, drawFont);

    float xpos = 0;
    float ypos = 0;

    switch (watermarkStatus)
    {
        case 1:
            xpos = (float)img.Width * (float).01;
            ypos = (float)img.Height * (float).01;
            break;
        case 2:
            xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
            ypos = (float)img.Height * (float).01;
            break;
        case 3:
            xpos = ((float)img.Width * (float).99) - crSize.Width;
            ypos = (float)img.Height * (float).01;
            break;
        case 4:
            xpos = (float)img.Width * (float).01;
            ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
            break;
        case 5:
            xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
            ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
            break;
        case 6:
            xpos = ((float)img.Width * (float).99) - crSize.Width;
            ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
            break;
        case 7:
            xpos = (float)img.Width * (float).01;
            ypos = ((float)img.Height * (float).99) - crSize.Height;
            break;
        case 8:
            xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
            ypos = ((float)img.Height * (float).99) - crSize.Height;
            break;
        case 9:
            xpos = ((float)img.Width * (float).99) - crSize.Width;
            ypos = ((float)img.Height * (float).99) - crSize.Height;
            break;
    }

    g.DrawString(watermarkText, drawFont, new SolidBrush(Color.White), xpos + 1, ypos + 1);
    g.DrawString(watermarkText, drawFont, new SolidBrush(Color.Black), xpos, ypos);

    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
    ImageCodecInfo ici = null;
    foreach (ImageCodecInfo codec in codecs)
    {
        if (codec.MimeType.IndexOf("jpeg") > -1)
        {
            ici = codec;
        }
    }
    EncoderParameters encoderParams = new EncoderParameters();
    long[] qualityParam = new long[1];
    if (quality < 0 || quality > 100)
    {
        quality = 80;
    }
    qualityParam[0] = quality;

    EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);
    encoderParams.Param[0] = encoderParam;

    if (ici != null)
    {
        img.Save(filename, ici, encoderParams);
    }
    else
    {
        img.Save(filename);
    }
    g.Dispose();
    img.Dispose();
}

调用示例:

AddImageSignPic(Image.FromFile(@"C:\test.jpg"), @"C:\a.jpg", @"C:\logo.gif", 1, 100, 2);
AddImageSignText(Image.FromFile(@"C:\test.jpg"), @"C:\b.jpg", "木子屋", 5, 100, "宋体", 20);


评论: 0 | 引用: 0 | 查看次数: 3992
发表评论
登录后再发表评论!