2012-06-05 11 views
18

Potrzebuję uzyskać zdjęcie od użytkownika, z różnymi rozszerzeniami formatu, i chcę je zawsze zapisać jako "jpg", dla łatwej obsługi. jest dobry sposób to zrobić w C# bez uzbrojenia jakości?C# Konwertuj formaty obrazów na jpg

+0

To zależy od platformy - Web, aplikacji mobilnej lub nawet jeśli yout wziąć kartę fotograficzną :) –

Odpowiedz

21

Od: 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

Doskonała dziękuję –

+0

Above kod nie działa dla mnie. Nie jest w stanie znaleźć klasy ImageCodecInfo, –

+0

to działa. btw Co robi @symbol w @ c: \ TestPhotoQualityZero.jpg oznacza –

2

systemu Windows GDI + zapewnia Image class i Bitmap class do przechowywania obrazów w pamięci i manipuluje obrazów w pamięci. GDI + zapisuje obrazy do plików dyskowych za pomocą enkoderów obrazu i ładuje obrazy z plików dyskowych przy pomocy dekoderów obrazu.

Sprawdź przeciążenia Image.Save Method w celu wdrożenia funkcjonalności. obsługujące różne formaty obrazów typu ImageFormat Class.

za przykładem na Image.Save Method (String, ImageCodecInfo, EncoderParameters), który pozwoli Ci zaoszczędzić Jpg plik z kodowaniem itp kodu

fragmencie:

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); 
    } 

// Codec informacji

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; 
     } 

    } 

Nadzieja to pomaga ..

10

Używam tego prostego rozszerzenia aby przekonwertować strumień, wszystko, co robi, to go przekonwertować i nie robi nic dla jakości.

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; 
} 

Wykorzystanie:

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

jest to najłatwiejsze rozwiązanie tego problemu. większość programistów po prostu go pomija: 3 – iceDragon

1

Spróbuj tego:

 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);