2012-06-05 18 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

以上コードは私のために働いていないようです。それはImageCodecInfoクラスを見つけることができません。 –

+0

は動作します.. btw @c:\ TestPhotoQualityZero.jpgの@symbolは –

2

WindowsのGDI +メモリに 画像を保存し、メモリ内の画像を操作するためのImage classBitmap classを提供します。 GDI +はイメージエンコーダの助けを借りてイメージ をディスクファイルに書き込み、 ディスクイメージのイメージをイメージデコーダの助けを借りて読み込みます。

オーバーロードをチェックして機能を実装してください。タイプImageFormat Classのさまざまな画像フォーマットをサポートしています。

あなたはエンコーディングなど

コードスニペットとJpgファイルを保存できるようになるこれ、Image.Save Method (String, ImageCodecInfo, EncoderParameters)上の例は次のとおり

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); 
関連する問題