2015-01-09 8 views
0

Я хочу написать приложение, которое принимает изображение (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 работает для данных форматов ввода, но не полностью покрывает мой вопрос, потому что часть декодирования изображения отсутствует.

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

+0

ли .NET поддерживают даже '.jrx'? Никогда не слышал об этом формате, и я сомневаюсь, что он поддерживается. Я думаю, вам нужно написать код, который сам выписывает это изображение. –

+0

В чем проблема? Сообщения? Результаты? Ожидаемые результаты? – DrKoch

+0

Что такое "нет полезного результата"? Что происходит? – CodeCaster

ответ

-2

попробовать это:

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

OK, вы в основном скопировали уже существующий ответ ... Было бы гораздо более полезно указать на ответ напрямую. –

+0

Я уже пробовал это. ToWpfBitmap() не известен моему компилятору. – b1ub

+1

Это метод расширения. После включения этого класса в ваш проект вы можете использовать его следующим образом: BitmapSource wmpBmpSource = myBitmap.ToWpfBitmap(); –