图片的大小和像素都不一样,加水印后的后果非常不理想,有的水印字体很小,而有的非常大,根本就显示不完,请问怎么解决,以下是我加水印的代码:
private void AddWater(string Source, string Dest, string addText)
{
  System.Drawing.Image image = System.Drawing.Image.FromFile(Source);  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.Red);
            
  g.DrawString(addText, f, b, 0, 0);
  g.Dispose();  image.Save(Dest);
  image.Dispose();
}

解决方案 »

  1.   

    http://www.codeproject.com/csharp/water.asp
    这有个处理的图片质量还行;。
      

  2.   

    maybe you can construct a new algorithm to implement the functionality that the text's size is changed according to the size of the image and other referring info.Good luck.
      

  3.   

    http://www.51aspx.com/CV/ImageUpload/
    ==============
    看看这个
      

  4.   

    http://www.wave12.com/web/home.asp
      
    缩略图水印组件wsImage3.5  
      

  5.   

    System.Drawing.Font f = new System.Drawing.Font("Verdana",60); //不要定死水印字体的大小啊,可以根据图片的大小来判断要打上多少大小的字体,如果图片很大,可以大一点,而如果很小的话,可以适当的小一点int temp = image.Width > image.Height ? image.Height : image.Width;
    if (temp > 500)
      font = new Font("Verdana", 100);
    else if (temp < 100)
      font = new Font("Verdana", 50);
    else
      font = new Font("Verdana", 75);
      

  6.   


    我也觉得也只有JGood() 说的这样咯
      

  7.   

    呵呵,这个问题,我去年已经解决了
    是这样的,你右键图片,看有一个属性是分辨率,有的是72DPI,有的是96DPI,都不一样,就是这个东西影响了你加水印的位置,所以,才会有楼主所说的问题解决办法就是把上传的图片都转化成统一的分辨率就好了,我现在是转化为96DPI,因为目前这种最多,且图片不大
      

  8.   

    '载入图片,取得长宽
                Dim myImg As System.Drawing.Image = System.Drawing.Image.FromFile(ImgName)
                Dim ImgWidth As Integer = myImg.Width
                Dim ImgHeight As Integer = myImg.Height            Dim grImg As Graphics
                Dim bmImg As Bitmap            '判断其分辨率,如果不等于96像素,那么新建一个24位的位图,并设置分辨率为96像素
                '把原图(新图)载入Graphic对象
                If myImg.HorizontalResolution = 96.0F And myImg.VerticalResolution = 96.0F Then
                    bmImg = New Bitmap(myImg)
                    grImg = Graphics.FromImage(bmImg)
                Else
                    bmImg = New Bitmap(ImgWidth, ImgHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb)
                    bmImg.SetResolution(96, 96)
                    grImg = Graphics.FromImage(bmImg)
                End If
      

  9.   

    System.Drawing.Font f = new System.Drawing.Font("Verdana",60); 
    60太绝对了,应根据情况定义值
      

  10.   

    我也感觉是分辨率的问题,因为Font的大小调来调去都不怎么适合,
    JGood() 的方法我之前也试过。
    等会再试试liujiayu10(www.xybxy.com) 的方法。
      

  11.   

    liujiayu10(www.xybxy.com)的方法好像也不行,能发完整的代码吗。
      

  12.   

    你用的是C#还是VB.net?Sub ImgWater(ByVal ImgName As String, ByVal Copyright As String)
            If System.IO.File.Exists(ImgName) Then
                '载入图片,取得长宽
                Dim myImg As System.Drawing.Image = System.Drawing.Image.FromFile(ImgName)
                Dim ImgWidth As Integer = myImg.Width
                Dim ImgHeight As Integer = myImg.Height            Dim grImg As Graphics
                Dim bmImg As Bitmap            '判断其分辨率,如果不等于96像素,那么新建一个24位的位图,并设置分辨率为96像素
                '把原图(新图)载入Graphic对象
                If myImg.HorizontalResolution = 96.0F And myImg.VerticalResolution = 96.0F Then
                    bmImg = New Bitmap(myImg)
                    grImg = Graphics.FromImage(bmImg)
                Else
                    bmImg = New Bitmap(ImgWidth, ImgHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb)
                    bmImg.SetResolution(96, 96)
                    grImg = Graphics.FromImage(bmImg)
                End If            '清除整个绘图面并以透明背景色填充
                '设置呈现模式为消除锯齿
                '在位图(x=0,y=0)的位置,把原图100%的大小绘制在位图上
                grImg.Clear(Color.Transparent)
                grImg.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias
                grImg.DrawImage(myImg, New Rectangle(0, 0, ImgWidth, ImgHeight), 0, 0, ImgWidth, ImgHeight, GraphicsUnit.Pixel)            '新建字体,并设置字体、字号、字型
                '设置在位图上画画的位置
                Dim crFont As Font = New Font("Arial", 10, FontStyle.Bold)
                Dim y As Single = 10.0F
                Dim x As Single = 20.0F            '先在位图上的原位置向右、向下一个像素的位置写黑色字作为阴影
                '再在位图上的原位置写灰色字,以两种字体叠加产生立体效果
                Dim TransBrush_yinying As SolidBrush = New SolidBrush(Color.FromArgb(153, 0, 0, 0))
                grImg.DrawString(Copyright, crFont, TransBrush_yinying, x + 1, y + 1)
                Dim TransBrush_zhuse As SolidBrush = New SolidBrush(Color.FromArgb(153, 255, 255, 255))
                grImg.DrawString(Copyright, crFont, TransBrush_zhuse, x, y)            '压缩图片,ImgZl为图片压缩质量0-100
                Dim ImgZl As Integer = 88
                Dim ICI As System.Drawing.Imaging.ImageCodecInfo = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders(1)
                Dim EP As System.Drawing.Imaging.EncoderParameters = New System.Drawing.Imaging.EncoderParameters(1)
                EP.Param(0) = New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, ImgZl)            '释放占用的资源
                myImg.Dispose()            '保存新图片,释放释放占用的资源
                Dim NewImg As System.Drawing.Image = bmImg
                NewImg.Save(ImgName, ICI, EP)
                grImg.Dispose()
                NewImg.Dispose()        End If    End Sub    '压缩图片为指定的MIIE格式GetEncoderInfo("image/jpeg")
        'GetEncoderInfo("image/jpeg")=System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders(1)
        Function GetEncoderInfo(ByVal mimeType As String) As System.Drawing.Imaging.ImageCodecInfo
            Dim i As Integer
            Dim encoders As System.Drawing.Imaging.ImageCodecInfo()
            encoders = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
            For i = 0 To encoders.Length - 1
                If encoders(i).MimeType = mimeType Then
                    Return encoders(i)
                End If
            Next
        End Function
      

  13.   

    C#版:    void ImgWater(string  ImgName,string Copyright)
        {
            if (System.IO.File.Exists(ImgName))
            {
                //载入图片,取得长宽
                System.Drawing.Image myImg = System.Drawing.Image.FromFile(ImgName);
                int ImgWidth = myImg.Width;
                int ImgHeight = myImg.Height;            Graphics grImg;
                Bitmap bmImg;            //判断其分辨率,如果不等于96像素,那么新建一个24位的位图,并设置分辨率为96像素
                //把原图(新图)载入Graphic对象
                if (myImg.HorizontalResolution == 96.0F && myImg.VerticalResolution == 96.0F)
                {
                    bmImg = new Bitmap(myImg);
                    grImg = Graphics.FromImage(bmImg);
                }
                else
                {
                    bmImg = new Bitmap(ImgWidth, ImgHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                    bmImg.SetResolution(96, 96);
                    grImg = Graphics.FromImage(bmImg);
                }            //清除整个绘图面并以透明背景色填充
                //设置呈现模式为消除锯齿
                //在位图(x=0,y=0)的位置,把原图100%的大小绘制在位图上
                grImg.Clear(Color.Transparent);
                grImg.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                grImg.DrawImage(myImg, new Rectangle(0, 0, ImgWidth, ImgHeight), 0, 0, ImgWidth, ImgHeight, GraphicsUnit.Pixel);            //新建字体,并设置字体、字号、字型
                //设置在位图上画画的位置
                Font crFont = new Font("Arial", 10, FontStyle.Bold);
                Single y = 10.0F;
                Single x = 20.0F;            //先在位图上的原位置向右、向下一个像素的位置写黑色字作为阴影
                //再在位图上的原位置写灰色字,以两种字体叠加产生立体效果
                SolidBrush TransBrush_yinying = new SolidBrush(Color.FromArgb(153, 0, 0, 0));
                grImg.DrawString(Copyright, crFont, TransBrush_yinying, x + 1, y + 1);
                SolidBrush TransBrush_zhuse = new SolidBrush(Color.FromArgb(153, 255, 255, 255));
                grImg.DrawString(Copyright, crFont, TransBrush_zhuse, x, y);            //压缩图片,ImgZl为图片压缩质量0-100
                int ImgZl = 88;
                System.Drawing.Imaging.ImageCodecInfo ICI;
                ICI = GetEncoderInfo("image/jpeg");
                System.Drawing.Imaging.EncoderParameters EP = new System.Drawing.Imaging.EncoderParameters(1);
                EP.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, ImgZl);            //释放占用的资源
                myImg.Dispose();            //保存新图片,释放释放占用的资源
                System.Drawing.Image NewImg = bmImg;
                NewImg.Save(ImgName, ICI, EP);
                grImg.Dispose();
                NewImg.Dispose();
            }
        }
        
        //压缩图片为指定的MIIE格式GetEncoderInfo("image/jpeg")
        //GetEncoderInfo("image/jpeg")=System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders(1)
        System.Drawing.Imaging.ImageCodecInfo GetEncoderInfo(string mimeType)
        {
            System.Drawing.Imaging.ImageCodecInfo[] encoders;
            encoders = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
            for(int i=0;i<encoders.Length;i++)
            {
                if(encoders[i].MimeType==mimeType)
                {
                    return encoders[i];
                }
            }
            return null;
        }
      

  14.   

    thanks.
    虽然效果还不是很完美,但已经比以前好多了。
    谢谢大家参与。