[英]Bmp to jpg/png in C#
有沒有辦法將bmp圖像轉換為jpg / png而不會失去C#的質量? 使用Image類我們可以將bmp轉換為jpg,但輸出圖像的質量非常差。 我們可以使用最高質量的photoshop獲得與轉換為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對象保存時,我對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;
這確實保持了相當高的質量,但不是最高的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.