2012-01-13 46 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