2012-01-13 57 views
2

我有一个处理器在图像上设置水印。问题是质量不太好。 这是代码:在高质量的图像上设置水印

byte[] imageBytes = null; 

    using (Graphics G = Graphics.FromImage(ImageToWatermark)) 
    { 
     using (ImageAttributes IA = new ImageAttributes()) 
     { 
      ColorMatrix CM = new ColorMatrix(); 
      CM.Matrix33 = Opacity; 
      IA.SetColorMatrix(CM); 
      G.DrawImage(Watermark, new Rectangle(WatermarkPosition, Watermark.Size), 0, 0, Watermark.Width, Watermark.Height, GraphicsUnit.Pixel, IA); 
     } 
    } 

    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     ImageToWatermark.Save(memoryStream, GetImageFormat(context.Request.PhysicalPath)); 
     imageBytes = memoryStream.ToArray(); 
    } 

如何设置结果的质量?

谢谢 阿丽娜

+1

你的意思是“质量不太好”? – Prutswonder 2012-01-13 10:39:27

+0

.jpg是低质量(像素)。 – 2012-01-13 10:52:47

回答

1

如果您的图像格式是JPEG,这时你可以手动使用此样本的方法来保存到磁盘设置输出质量:

public void SaveJpg(string path, Bitmap img, long quality) { 
     // Encoder parameter for image quality 
     EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality); 

     // Jpeg image codec 
     ImageCodecInfo jpegCodec = this.getEncoderInfo("image/jpeg"); 

     EncoderParameters encoderParams = new EncoderParameters(1); 
     encoderParams.Param[0] = qualityParam; 

     img.Save(path, jpegCodec, encoderParams); 
    } 

或者,在情况下,使用下面的代码段:

using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, 80); // edit image quality here 
     ImageCodecInfo jpegCodec = this.getEncoderInfo("image/jpeg"); 
     EncoderParameters encoderParams = new EncoderParameters(1); 
     encoderParams.Param[0] = qualityParam; 

     ImageToWatermark.Save(memoryStream, encoderParams); 
     imageBytes = memoryStream.ToArray(); 
    } 

通常,60〜100质量应产生用于屏幕输出足够好JPEG图像。

+0

我不会将结果图像保存在我的服务器上,我在运行时创建带有水印的图像。 – 2012-01-13 11:02:48

+0

@ Coderock.net可能这是解决方案。保存不仅保存在磁盘上,而且还保存在流中。试试这个,或者像这样的东西。 – Aristos 2012-01-13 11:27:09

+0

我已经更新了我对内存流使用的回答。 – Prutswonder 2012-01-13 11:57:24