有什麼辦法可以將bmp圖像轉換成jpg/png而不會丟失C#中的質量?使用Image類我們可以將bmp轉換爲jpg,但輸出圖像的質量非常差。我們可以通過使用最高質量的photoshop將圖像轉換爲jpg來獲得質量水平嗎?Bmp到jpg/png在C#
回答
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;
哪個確保質量相當高,但不是最高的可能性樂。
位圖沒有這樣的屬性。它們必須應用於圖形和圖像修改期間,例如調整大小。 – 2012-01-02 17:36:12
基本上,您將無法保持相同的質量,因爲即使採用儘可能高的質量設置,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;
}
}
等效表達式GetEncoder: ```返回ImageCodecInfo.GetImageDecoders()其中(x => x.FormatID == format.Guid).FirstOrDefault();``` – Nuzzolilo 2015-05-21 22:59:31
提供BitmapExtensions通過jestro是偉大的,我用他們。但是想顯示修正版本 - 適用於因爲我認爲這是更方便,提供了一種方法來提供高質量的圖像父類:
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. 保存BMP到字典C#
- 2. BMP char數組到文件C/C++
- 3. 32位rgb bmp到C#中的24位rgb bmp問題
- 4. .bmp在C中的處理
- 5. UWP/C#旋轉BMP
- 6. C/C++旋轉BMP圖像
- 7. C# - Base64編碼JPEG到Base64編碼BMP
- 8. PNG到bmp
- 9. BufferedImage到Java的BMP
- 10. 閱讀BMP文件C++(閱讀BMP標題時遇到的問題)
- 11. C++:BMP旋轉圖像
- 12. C讀取bmp文件
- 13. 將Bmp灰度讀入C
- 14. c從BMP獲取數據
- 15. C,BMP處理...不知道:/
- 16. C# - 從字節創建BMP
- 17. C++在BMP中嵌入QR碼
- 18. 在C++/OpenGL中加載tga/bmp文件
- 19. 在c中讀取/寫入bmp文件
- 20. bmp在C中的圖像數據
- 21. 在C中讀取bmp頭文件
- 22. 在BMP中將BMP轉換爲JPG
- 23. 在C++的bmp文件中獲取指針到dib的指針
- 24. 在讀取/寫入.bmp文件時遇到困難C
- 25. 在.bin文件中找到bmp
- 26. WM_PRINTCLIENT到BMP全黑色
- 27. 將.bmp加載到Texture2D中
- 28. 轉換8位色的BMP圖像到8位灰度BMP
- 29. 如何在C \ C++中重新調整.bmp文件的大小?
- 30. 如何將.c或.bmp更改爲.ttf
這裏應該沒有_using_陳述嗎?我注意到EncoderParameter是IDisposable的,但我不是掌握足夠的一次性模式來確定它們是否需要。在一行 – TwainJ 2011-11-15 19:37:24