2012-06-05 101 views
18

我需要得到来自用户的图片,用不同的格式的扩展,以及我要永远保存为“JPG”,方便搬运。 有没有一种很好的方式做到这一点在C#没有武装的质量?C#转换图片格式为JPG

+0

这取决于平台 - 网络,应用程序,移动或者即使YOUT拍照卡:) –

回答

21

来自:http://msdn.microsoft.com/en-us/library/system.drawing.imaging.encoderparameter.aspx

private void VaryQualityLevel() 
{ 
// Get a bitmap. 
Bitmap bmp1 = new Bitmap(@"c:\TestPhoto.jpg"); 
ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg); 

// Create an Encoder object based on the GUID 
// for the Quality parameter category. 
System.Drawing.Imaging.Encoder myEncoder = 
    System.Drawing.Imaging.Encoder.Quality; 

// Create an EncoderParameters object. 
// An EncoderParameters object has an array of EncoderParameter 
// objects. In this case, there is only one 
// EncoderParameter object in the array. 
EncoderParameters myEncoderParameters = new EncoderParameters(1); 

EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 
    50L); 
myEncoderParameters.Param[0] = myEncoderParameter; 
bmp1.Save(@"c:\TestPhotoQualityFifty.jpg", jgpEncoder, 
    myEncoderParameters); 

myEncoderParameter = new EncoderParameter(myEncoder, 100L); 
myEncoderParameters.Param[0] = myEncoderParameter; 
bmp1.Save(@"c:\TestPhotoQualityHundred.jpg", jgpEncoder, 
    myEncoderParameters); 

// Save the bitmap as a JPG file with zero quality level compression. 
myEncoderParameter = new EncoderParameter(myEncoder, 0L); 
myEncoderParameters.Param[0] = myEncoderParameter; 
bmp1.Save(@"c:\TestPhotoQualityZero.jpg", jgpEncoder, 
    myEncoderParameters); 

} 

... 

private ImageCodecInfo GetEncoder(ImageFormat format) 
{ 

    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 

    foreach (ImageCodecInfo codec in codecs) 
    { 
     if (codec.FormatID == format.Guid) 
     { 
      return codec; 
     } 
    } 
    return null; 
} 
+0

外观极好谢谢 –

+0

以上代码似乎并不为me.It工作无法找到ImageCodecInfo类, –

+0

它的工作原理..顺便说一句请告诉我没有@symbol在@c:\ TestPhotoQualityZero.jpg表示 –

2

Windows GDI +中提供Image classBitmap class,用于存储 图像和在存储器操作图像。 GDI +写入图像 到磁盘文件与图像编码器和负载图像的帮助下从 磁盘文件与图像解码器的帮助。

检查Image.Save Method重载实现您的功能。它支持ImageFormat Class类型的各种图像格式。

遵循Image.Save Method (String, ImageCodecInfo, EncoderParameters)例子,可以让你保存Jpg文件,编码等

代码片段:

using System; 
using System.Drawing; 
using System.Drawing.Imaging; 
class Example_SetJPEGQuality 
{ 
    public static void Main() 
    { 
     Bitmap myBitmap; 
     ImageCodecInfo myImageCodecInfo; 
     Encoder myEncoder; 
     EncoderParameter myEncoderParameter; 
     EncoderParameters myEncoderParameters; 

     // Create a Bitmap object based on a BMP file. 
     myBitmap = new Bitmap("Shapes.bmp"); 

     // Get an ImageCodecInfo object that represents the JPEG codec. 
     myImageCodecInfo = GetEncoderInfo("image/jpeg"); 

     // Create an Encoder object based on the GUID 

     // for the Quality parameter category. 
     myEncoder = Encoder.Quality; 

     // Create an EncoderParameters object. 

     // An EncoderParameters object has an array of EncoderParameter 

     // objects. In this case, there is only one 

     // EncoderParameter object in the array. 
     myEncoderParameters = new EncoderParameters(1); 

     // Save the bitmap as a JPEG file with quality level 25. 
     myEncoderParameter = new EncoderParameter(myEncoder, 25L); 
     myEncoderParameters.Param[0] = myEncoderParameter; 
     myBitmap.Save("Shapes025.jpg", myImageCodecInfo, myEncoderParameters); 

     // Save the bitmap as a JPEG file with quality level 50. 
     myEncoderParameter = new EncoderParameter(myEncoder, 50L); 
     myEncoderParameters.Param[0] = myEncoderParameter; 
     myBitmap.Save("Shapes050.jpg", myImageCodecInfo, myEncoderParameters); 

     // Save the bitmap as a JPEG file with quality level 75. 
     myEncoderParameter = new EncoderParameter(myEncoder, 75L); 
     myEncoderParameters.Param[0] = myEncoderParameter; 
     myBitmap.Save("Shapes075.jpg", myImageCodecInfo, myEncoderParameters); 
    } 

//编解码器信息

private static ImageCodecInfo GetEncoderInfo(String mimeType) 
     { 
      int j; 
      ImageCodecInfo[] encoders; 
      encoders = ImageCodecInfo.GetImageEncoders(); 
      for(j = 0; j < encoders.Length; ++j) 
      { 
       if(encoders[j].MimeType == mimeType) 
        return encoders[j]; 
      } 
      return null; 
     } 

    } 

希望这有助于..

10

我用这个简单的扩展要转换一个流,它所做的只是转换它,而对质量没有任何作用。

public static Stream ConvertImage(this Stream originalStream, ImageFormat format) 
{ 
       var image = Image.FromStream(originalStream); 

       var stream = new MemoryStream(); 
       image.Save(stream, format); 
       stream.Position = 0; 
       return stream; 
} 

用法:

var outputStream = gifStream.ConvertImage(ImageFormat.Png); 
+0

这是此问题的最简单解决方案。大多数开发者只是省略它:3 – iceDragon

1

试试这个:

 public static class BitmapExtension 
     { 
      public static void Save(this Bitmap bitmap, String fileName, ImageFormat imageFormat, long quality = 75L) 
      { 
      using (var encoderParameters = new EncoderParameters(1)) 
      using (encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality)) 
      { 
       ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 

       bitmap.Save(fileName, codecs.Single(codec => codec.FormatID == imageFormat.Guid), encoderParameters); 
      } 
      } 
     } 

     ... 

     Bitmap bitmap = new Bitmap("myImage.bmp"); 

     bitmap.Save("myImage.jpg", ImageFormat.Jpeg, 50L);