bmp 이미지를 jpg/png로 변환 할 수있는 방법이 있나요? Image 클래스를 사용하면 bmp를 jpg로 변환 할 수 있지만 출력 이미지의 품질은 매우 좋지 않습니다. 최고 품질의 포토샵을 사용하여 jpg로 변환 한 이미지만큼 품질 수준을 높일 수 있습니까? 그것은 당신을 도울 수있는 몇 가지의 소스 코드가 같은C#의 jpg/png에서 BMP로
답변
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
This 난 당신이 바로 품질 인코더 매개 변수를 < 어깨를 으쓱 누락 된 의심 ... 보이는>
당신은 시도 할 수 있습니다 :
Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;
및
Bitmap.CompositingQuality = CompositingQuality.HighQuality;
품질은 상당히 높지만 높지는 않습니다. 르.
비트 맵에는 이러한 속성이 없습니다. Graphics 및 리사이징과 같은 이미지 수정 중에 적용해야합니다. –
근본적으로 jpg는 최상의 품질 설정에서도 항상 손실이 발생하기 때문에 동일한 품질을 유지할 수 없습니다.
비트 정밀도의 품질이 중요한 경우, 무손실 모드가있는 png 사용을 고려하십시오.
JPEG는 자연히 손실 형식입니다. 그래서 thoery에서도 높은 설정에서 약간의 정보 손실을 보게 될 것입니다.하지만 이미지에 많은 영향을줍니다. 그러나 png는 무손실입니다.
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는 훌륭합니다. 내가 비용 보고서 응용 프로그램 작업입니다
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);
}
}
, 나는 정말 기쁘게 생각합니다 : 내가 생각하는 더 편리과 품질을 제공 할 수있는 방법을 제공합니다 이미지 상위 클래스 작동 - 그러나 수정 된 버전을 보여 드리고자합니다 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에있어
.
여기에 _using_ 문구가 없어야합니까? EncoderParameter가 IDisposable이라는 것을 알았지 만, 필자가 필요로하는 일회용 패턴을 충분히 마스터하지 못했습니다. 하나 개의 라인에 대한 GetEncoder – TwainJ