문제

C#에서 품질을 잃지 않고 bmp 이미지를 jpg/png로 변환할 수 있는 방법이 있습니까?Image 클래스를 사용하면 bmp를 jpg로 변환할 수 있지만 출력 이미지의 품질은 매우 낮습니다.최고 품질의 포토샵을 사용하여 jpg로 변환한 이미지만큼 좋은 품질을 얻을 수 있을까요?

도움이 되었습니까?

해결책

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

다른 팁

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;
    }
}

Jestro가 제공한 BitmapExtensions가 훌륭해서 사용했습니다.그러나 수정된 ​​버전을 보여주고 싶습니다. 제 생각에는 더 편리하고 품질을 제공하는 방법을 제공하는 Image 상위 클래스에서 작동합니다.

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);
    }
}

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

비트 정확도가 정말 중요한 경우 무손실 모드가 있는 png 사용을 고려해 보세요.

JPEG는 본질적으로 손실이 많은 형식이라고 말하고 싶습니다.따라서 가장 높은 설정에서도 약간의 정보 손실이 발생하지만 이는 이미지에 따라 많이 달라집니다. 그러나 png는 무손실입니다.

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

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;

그리고

Bitmap.CompositingQuality = CompositingQuality.HighQuality;

품질을 상당히 높게 유지하지만 가능한 최고 수준은 아닙니다.

저는 경비 보고서 앱을 개발 중인데 비트맵 개체에서 저장할 때 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을 사용하고 있습니다. 아마도 후속 프레임워크 릴리스에서는 품질이 향상되었을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top