C # конвертировать форматы изображений в JPG

Мне нужно получить изображение от пользователя с различными расширениями формата, и я хочу всегда сохранять его как «jpg» для удобства обработки. Есть ли хороший способ сделать это в C # без постановки на качество?

 Aleksej Vasinov05 июн. 2012 г., 11:35
Это зависит от платформы - веб, приложение, мобильный или даже если вы берете фото карту :)

Ответы на вопрос(5)

Я использую это простое расширение для преобразования потока, все, что он делает, это конвертирует его и ничего не делает для качества.

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);
 22 дек. 2014 г., 13:13
это самое простое решение этой проблемы. большинство разработчиков просто пропускают это: 3

Windows GDI+ provides the Image class and the Bitmap class for storing images in memory and manipulating images in memory. GDI+ writes images to disk files with the help of image encoders and loads images from disk files with the help of image decoders.

ПроверьтеImage.Save Method перегрузки для реализации вашей функциональности. которые поддерживают различные форматы изображений типаКласс ImageFormat.

следуйте примеру наМетод Image.Save (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;
        }

    }

Надеюсь, что это поможет ..

Решение Вопроса

От: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 jpgEncoder = 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", jpgEncoder, 
    myEncoderParameters);

myEncoderParameter = new EncoderParameter(myEncoder, 100L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(@"c:\TestPhotoQualityHundred.jpg", jpgEncoder, 
    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", jpgEncoder, 
    myEncoderParameters);

}

...

private ImageCodecInfo GetEncoder(ImageFormat format)
{

    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

    foreach (ImageCodecInfo codec in codecs)
    {
        if (codec.FormatID == format.Guid)
        {
            return codec;
        }
    }
    return null;
}
 mashta gidi05 июн. 2012 г., 13:25
Отличное спасибо
 27 авг. 2016 г., 05:17
Выше код, кажется, не работает для меня. Он не может найти класс ImageCodecInfo,
 27 авг. 2016 г., 07:02
это работает .. кстати Что @symbol в @c: \ TestPhotoQualityZero.jpg означать
 29 авг. 2016 г., 13:48
@SudarshanTaparia Это означает, что каждый символ в строке после этого символа должен рассматриваться как есть. В противном случае необходимо использовать двойную обратную косую черту (& quot; \\ & quot;), поскольку обратная косая черта с некоторым символом означает "специальный символ". Нравится & quot; \ n & quot; является "новой строкой" и преобразуется в символ с кодом 13.

Попробуй это:

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

Вы можете использовать API изображений для создания изображения в памяти, а затем сохранить его в формате JPG. http://msdn.microsoft.com/en-us/library/ms142147.aspx

Ваш ответ на вопрос