C#で品質を落とさずにbmp画像をjpg/pngに変換する方法はありますか? Image クラスを使用して bmp を jpg に変換できますが、出力画像の品質は非常に低くなります。最高品質のPhotoshopを使用してjpgに変換された画像と同じくらいの品質レベルを得ることができますか?
7 に答える
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);
}
}
JPEGは本質的に不可逆形式であると言いたいだけです。したがって、最高の設定でも情報が失われる可能性がありますが、それは画像に大きく依存します。しかし、pngは損失がありません。
jpg は (私が知る限り) 可能な限り最高の品質設定を使用しても常に損失が多いため、基本的に同じ品質を維持することはできません。
ビット精度の品質が本当に重要な場合は、ロスレスのモードがいくつかある png の使用を検討してください。
私は経費報告アプリに取り組んでおり、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を使用しています...おそらく、その後のフレームワークのリリースで品質が向上しました。
あなたが試すことができます:
Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;
と
Bitmap.CompositingQuality = CompositingQuality.HighQuality;
これにより、品質はかなり高く保たれますが、可能な限り最高ではありません。