bmpイメージをjpg/pngに変換する方法はありますか?C#で品質を失うことはありませんか? Imageクラスを使用すると、bmpをjpgに変換できますが、出力イメージの品質は非常に悪いです。最高品質のPhotoshopを使用して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は本質的に損失の多いフォーマットです。だから、たとえ最高の設定であっても、情報が失われることはありますが、画像にはかなりの違いがあります。しかし、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でよ。
- 1. C++:ファイル内の.bmpからバイト配列へ
- 2. C++:BMPイメージの回転
- 3. UWP/C#回転BMP
- 4. bmpをcでコピーする
- 5. C++/SDL2で.bmpイメージを表示
- 6. PHPの画像変換JPG/GIF/PNGからBMP/ICOへ
- 7. PDFファイルからBMPへの変換と印刷
- 8. Javaおよびeclipseエラーで.bmpからjpeg2000への変換エラー
- 9. bmpファイルの比較?
- 10. .bmpでの処理
- 11. C言語でのBMPファイルでのパディングの扱い
- 12. C言語のBMPファイル内のピクセルの反転色
- 13. Cの.bmpイメージの幅と高さを見つける
- 14. XImageをC言語の.bmpファイルに書き込む
- 15. 1、8、24ビットのBMPファイルをC++で読み取る
- 16. MFC C++のペン機能を.bmpに置き換える
- 17. C言語のBMP画像を縮尺する
- 18. C++でbmpファイルの幅と高さを読み取る
- 19. 開き、BMPとOpenCVの2.1
- 20. Silverlight 4 BitmapImage - bmpファイルのサポート
- 21. divのうちJpeg/PNG/BMP
- 22. JPEG、BMP、PNGのGUID変数
- 23. RTF BMPファイルの文字列
- 24. GDSIIレイアウトのクリップbmpイメージ
- 25. LibQREncode qrcode to BMP
- 26. Octave imread bmpファイル
- 27. どのように配列にBMPファイルを置くために、C++、C
- 28. C++クラスへのC++ DLLへのC#Windowsフォームクラスへの変換
- 29. Paradoxを使用したDelphi 7でのリアルタイムBMPからJPGへの変換
- 30. bmpファイルのデータを読み込んで別のbmpに書き込む
ここには_using_ステートメントがありませんか?私はEncoderParameterがIDisposableであることに気づいていますが、私は使い捨てパターンが必要であると確信するための十分なマスターではありません。 1行でGetEncoderため – TwainJ