2008-09-03 4 views
48

bmp 이미지를 jpg/png로 변환 할 수있는 방법이 있나요? Image 클래스를 사용하면 bmp를 jpg로 변환 할 수 있지만 출력 이미지의 품질은 매우 좋지 않습니다. 최고 품질의 포토샵을 사용하여 jpg로 변환 한 이미지만큼 품질 수준을 높일 수 있습니까? 그것은 당신을 도울 수있는 몇 가지의 소스 코드가 같은C#의 jpg/png에서 BMP로

답변

53
var qualityEncoder = Encoder.Quality; 
var quality = (long)<desired quality>; 
var ratio = new EncoderParameter(qualityEncoder, quality); 
var codecParams = new EncoderParameters(1); 
codecParams.Param[0] = ratio; 
var jpegCodecInfo = <one of the codec infos from ImageCodecInfo.GetImageEncoders() with mime type = "image/jpeg">; 
bmp.Save(fileName, jpegCodecInfo, codecParams); // Save to JPG 
+1

여기에 _using_ 문구가 없어야합니까? EncoderParameter가 IDisposable이라는 것을 알았지 만, 필자가 필요로하는 일회용 패턴을 충분히 마스터하지 못했습니다. 하나 개의 라인에 대한 GetEncoder – TwainJ

3

This 난 당신이 바로 품질 인코더 매개 변수를 < 어깨를 으쓱 누락 된 의심 ... 보이는>

0

당신은 시도 할 수 있습니다 :

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic; 

Bitmap.CompositingQuality = CompositingQuality.HighQuality; 

품질은 상당히 높지만 높지는 않습니다. 르.

+0

비트 맵에는 이러한 속성이 없습니다. Graphics 및 리사이징과 같은 이미지 수정 중에 적용해야합니다. –

1

근본적으로 jpg는 최상의 품질 설정에서도 항상 손실이 발생하기 때문에 동일한 품질을 유지할 수 없습니다.

비트 정밀도의 품질이 중요한 경우, 무손실 모드가있는 png 사용을 고려하십시오.

1

JPEG는 자연히 손실 형식입니다. 그래서 thoery에서도 높은 설정에서 약간의 정보 손실을 보게 될 것입니다.하지만 이미지에 많은 영향을줍니다. 그러나 png는 무손실입니다.

30
public static class BitmapExtensions 
{ 
    public static void SaveJPG100(this Bitmap bmp, string filename) 
    {    
     EncoderParameters encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
     bmp.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    public static void SaveJPG100(this Bitmap bmp, Stream stream) 
    { 
     EncoderParameters encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
     bmp.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    public static ImageCodecInfo GetEncoder(ImageFormat format) 
    { 
     ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 

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

     return null; 
    } 
} 
+0

등가 식 :. '' '()를 반환 ImageCodecInfo.GetImageDecoders 여기서 (X => x.FormatID == format.Guid) .FirstOrDefault()'' – Nuzzolilo

+2

심지어 짧은 창' FirstOrDefault (x => x.FormatID == ImageFormat.Jpeg.Guid);'. – Jan

10

제공된 jestro의 BitmapExtensions는 훌륭합니다. 내가 비용 보고서 응용 프로그램 작업입니다

public static class ImageExtensions 
{ 
    public static void SaveJpeg(this Image img, string filePath, long quality) 
    { 
     var encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
     img.Save(filePath, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    public static void SaveJpeg(this Image img, Stream stream, long quality) 
    { 
     var encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
     img.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    static ImageCodecInfo GetEncoder(ImageFormat format) 
    { 
     ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 
     return codecs.Single(codec => codec.FormatID == format.Guid); 
    } 
} 
0

, 나는 정말 기쁘게 생각합니다 : 내가 생각하는 더 편리과 품질을 제공 할 수있는 방법을 제공합니다 이미지 상위 클래스 작동 - 그러나 수정 된 버전을 보여 드리고자합니다 Bitmap 객체에서 저장할 때 JPG (및 PNG)에 대한 기본 품질 설정이 적용됩니다.

https://msdn.microsoft.com/en-us/library/9t4syfhh%28v=vs.110%29.aspx

Bitmap finalBitmap = ....; //from disk or whatever 
finalBitmap.Save(xpsFileName + ".final.jpg", ImageFormat.Jpeg); 
finalBitmap.Save(xpsFileName + ".final.png", ImageFormat.Png); 

나는 아마 품질은 이후 프레임 워크의 버전에서 더 발전하고있다 ... .NET 4.6에있어

.