Как изменить форматы файлов изображений

Я хочу написать приложение, которое принимает изображение (jpeg, png, tiff, gif,...) в виде потока и конвертирует его в jrx(jpeg xr) со сжатием без потерь.

Это то, что я пробовал до сих пор без полезного результата:

using System.Windows.Media.Imaging;
    //decode jpg
    public static BitmapSource ReadJpeg(Stream imageStreamSource)
    {
        JpegBitmapDecoder decoder = new JpegBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        BitmapSource bitmapSource = decoder.Frames[0];
        return bitmapSource;
    }
    //encode
    public static Stream Encode(BitmapSource image)
    {
        WmpBitmapEncoder encoder = new WmpBitmapEncoder();
        MemoryStream s = new MemoryStream();
        encoder.Frames.Add(BitmapFrame.Create(image));
        encoder.Save(s);
        return s;
    }

Может ли кто-нибудь указать мне правильное направление? Я здесь в течение некоторого времени.

Если вам нужна дополнительная информация, пожалуйста, спросите.

System.Drawing.Bitmap to JPEG XR работает для заданных форматов ввода, но не полностью покрывает мой вопрос, потому что часть декодирования изображения отсутствует.

Спасибо всем за то, что указали мне правильное направление! Теперь я знаю, как поступить.

1 ответ

Решение

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

public static MemoryStream SaveJpegXr(this Bitmap bitmap, float quality) 
    {
        var stream = new MemoryStream();
        SaveJpegXr(bitmap, quality, stream);
        stream.Seek(0, SeekOrigin.Begin);
        return stream;
    }

    public static void SaveJpegXr(this Bitmap bitmap, float quality, Stream output) 
     {
        var bitmapSource = bitmap.ToWpfBitmap();
        var bitmapFrame = BitmapFrame.Create(bitmapSource);
        var jpegXrEncoder = new WmpBitmapEncoder();
        jpegXrEncoder.Frames.Add(bitmapFrame);
        jpegXrEncoder.ImageQualityLevel = quality / 100f;
        jpegXrEncoder.Save(output);
    }


    public static BitmapSource ToWpfBitmap(this Bitmap bitmap)
 {
        using (var stream = new MemoryStream()) 
        {
            bitmap.Save(stream, ImageFormat.Bmp);
            stream.Position = 0;
            var result = new BitmapImage();
            result.BeginInit();


            result.CacheOption = BitmapCacheOption.OnLoad;
            result.StreamSource = stream;
            result.EndInit();
            result.Freeze();
            return result;
        }
    }
Другие вопросы по тегам