it-swarm.com.ru

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

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

21
mashta gidi

От: 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;
}
23
465544

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

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);
10
Sam Jones

Windows GDI + предоставляет класс Image и класс Bitmap для хранения изображения в памяти и манипулирование изображениями в памяти. GDI + пишет изображения на дисковые файлы с помощью кодировщиков изображений и загружает изображения из Дисковые файлы с помощью декодеров изображений.

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

следуйте примеру метода 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;
        }

    }

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

2
Niranjan Singh

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

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

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

0
Slavo