2013-05-03 3 views
3

이미지에 워터 마크를 추가하고 최상의 품질로 저장하려고하지만 JPEG 워터 마크의 저장 품질이 낮지 만 (주 이미지 품질이 좋음)C# : JPEG를 저장할 때 워터 마크 이미지의 품질이 낮습니다.

string wtrSrc = @"D:\watermark.png"; 
string imgSrc = @"D:\image.jpg"; 
string imgOutJPG = @"D:\result.jpg";   
string imgOutPNG = @"D:\result.png"; 

// create new image 
Bitmap imgOutput = new Bitmap(imgSrc); 
Graphics outputGraphics = Graphics.FromImage(imgOutput); 

// image quality 
outputGraphics.CompositingQuality = CompositingQuality.HighQuality; 
outputGraphics.InterpolationMode = InterpolationMode.HighQualityBilinear; 
outputGraphics.SmoothingMode = SmoothingMode.HighQuality; 
outputGraphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

// create watermark image 
System.Drawing.Image wtrmark = System.Drawing.Image.FromFile(wtrSrc);   

// add waternark 
float wtrmarkX = 10; 
float wtrmarkY = 10; 
outputGraphics.DrawImage(wtrmark, wtrmarkX, wtrmarkY); 

//set jpeg quality  
EncoderParameters myEncoderParameters = new EncoderParameters(1); 
EncoderParameter myEncoderParameter = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
myEncoderParameters.Param[0] = myEncoderParameter; 

// save result 
imgOutput.Save(imgOutJPG, GetEncoder(ImageFormat.Jpeg), myEncoderParameters); 
imgOutput.Save(imgOutPNG, ImageFormat.Png); 

// clean 
wtrmark.Dispose(); 
imgOutput.Dispose(); 
outputGraphics.Dispose(); 

......

// ImageCodecInfo 
    private ImageCodecInfo GetEncoder(ImageFormat format) 
    { 

     ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 

     foreach (ImageCodecInfo codec in codecs) 
     { 
      if (codec.FormatID == format.Guid) 
      { 
       return codec; 
      } 
     } 
     return null; 
    } 

PNG 절약은 잘 작동하지만 JPEG를 저장해야합니다. 다음은 PNG와 JPEG http://i.stack.imgur.com/CqwgZ.jpg

의 차이가있어이 글 http://www.codeproject.com/Articles/2927/Creating-a-Watermarked-Photograph-with-GDI-for-NET을 다음과 같은 결과를 얻을.

JPEG에서 워터 마크를 만드는 방법이 좋습니까?

+0

이 문제가 예 : http 소스 이미지에 투명도가 될 수 우리의 B 서비스에 대한 코드 아래 사용 변수 PATH의 enviornment에서 http://www.google.com/questions/6513633/c-convert-transparent-png-to-jpg-with-non-black-background-color? –

+0

아니요, 워터 마크 단순 JPEG 이미지로 사용하려고했지만 결과는 같습니다. 다음은 예입니다. - http://i.imgur.com/SZQuEyR.jpg?1 – user1032559

+0

InterpolationMode.InterpolationModeHighQualityBicubic를 사용해 보셨습니까? –

답변

1

먼저 C에있는 Imagemagick를 인스톨 한후에 : 설치가 C를 추가하는 동안 창에있는 Imagemagick 폴더

http://www.imagemagick.org/download/binaries/ImageMagick-6.8.8-7-Q16-x86-dll.exe

를 사용하여 \ : ImageMagick를 \; // :

using System.IO; 
    using System.Drawing; 

    [WebMethod] 
     public Byte[] WatermarkImage(Byte[] image) 
     { 
    MemoryStream ms = new MemoryStream(image); 
    Image image2 = Image.FromStream(ms); 
    image2.Save(Server.MapPath("~") + "\\imageTest.jpg"); 
    string strCmdText; 
    strCmdText = "/C convert.exe -draw \"gravity south fill black text 0,0 'Parth' \" \"" + Server.MapPath("~") +"\\imageTest.jpg \" \""+Server.MapPath("~") +"\\imageTest_result.jpg \""; 
    System.Diagnostics.Process.Start("CMD.exe", strCmdText); 
    System.Threading.Thread.Sleep(1000); 
    byte[] imgdata = System.IO.File.ReadAllBytes(Server.MapPath("~") +"\\imageTest_result.jpg"); 
    return imgdata; 
     } 

이 웹 페이지에서 사용이

 protected void Button1_Click(object sender, EventArgs e) 
     { 
      if (this.FileUpload1.HasFile) 
      { 
     if (FileUpload1.PostedFile.ContentType == "image/jpeg") 
     { 
      if (FileUpload1.PostedFile.ContentLength < 512000) 
      { 
       string filename = Path.GetFileName(FileUpload1.FileName); 
       FileUpload1.SaveAs(Server.MapPath("~") + "\\" + filename); 
       Watermark w = new Watermark(); 
       Byte[] b = w.WatermarkImage(GetBytesFromFile(Server.MapPath("~") + "\\" + filename)); 
       MemoryStream ms = new MemoryStream(b); 
       System.Drawing.Image image2 = System.Drawing.Image.FromStream(ms); 
       image2.Save(Server.MapPath("~") + "\\imageTest_op.jpg"); 
       Image1.ImageUrl = "imageTest_op.jpg"; 
      } 
       } 
      } 
     } 
관련 문제