2013-09-11 5 views
0

я использую следующий код для преобразования BitmapSource в массив байтов, представляющий PNG:Преобразовать массив байтов PNG в массив байтов JPEG

/// <summary> 
    /// Converts BitmapSource to a PNG Bitmap. 
    /// </summary> 
    /// <param name="source">The source object to convert.</param> 
    /// <returns>byte array version of passed in object.</returns> 
    public static byte[] ToPngBytes(this BitmapSource source) 
    { 
     // Write the source to the bitmap using a stream. 
     using (MemoryStream outStream = new MemoryStream()) 
     { 
      // Encode to Png format. 
      var enc = new Media.Imaging.PngBitmapEncoder(); 
      enc.Frames.Add(Media.Imaging.BitmapFrame.Create(source)); 
      enc.Save(outStream); 

      // Return image bytes. 
      return outStream.ToArray(); 
     } 
    } 

Я ищу, чтобы сделать ту же операцию, но преобразовать массив байтов, что это Jpeg без необходимости сначала создавать BitmapSource.

Подпись должна выглядеть следующим образом:

public static byte[] ToPngBytes(this byte[] jpegBytes) 

Этот код работает, но кажется неэффективным, как я использовать Записываемый Bitmap, чтобы сделать это:

private WriteableBitmap colorBitmap; 

    private byte[] GetCompressedImage(byte[] imageData, System.Windows.Media.PixelFormat format, int width, int height, int bytesPerPixel = sizeof(Int32)) 
    { 
     // Initialise the color bitmap converter. 
     if (colorBitmap == null) 
      colorBitmap = new WriteableBitmap(width, height, 96.0, 96.0, format, null); 

     // Write the pixels to the bitmap. 
     colorBitmap.WritePixels(new Int32Rect(0, 0, width, height), imageData, width * bytesPerPixel, 0); 

     // Memory stream used for encoding. 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      PngBitmapEncoder encoder = new PngBitmapEncoder(); 

      // Add the frame to the encoder. 
      encoder.Frames.Add(BitmapFrame.Create(colorBitmap)); 
      encoder.Save(memoryStream); 

      // Get the bytes. 
      return memoryStream.ToArray(); 
     } 
    } 
+0

Что об этом ? http://msdn.microsoft.com/en-us/library/twss4wb0%28v=vs.90%29.aspx – laszlokiss88

+0

К сожалению, это будет работать только при сохранении на диске, но это во время выполнения и должно быть из байта [ ] source. Спасибо, хотя! –

+0

Вы можете заменить свой WriteableBitmap, вызвав статический метод BitmapSource.Create вместо этого: http://msdn.microsoft.com/en-us/library/ms616045.aspx – Aybe

ответ

2

Ниже приведен фрагмент кода взять байтовый массив любого формата и преобразовать его в массив байтов с форматом JPG:

byte[] jpgImageBytes = null; 
using (var origImageStream = new MemoryStream(image)) 
using (var jpgImageStream = new MemoryStream()) 
{ 
    var jpgImage = System.Drawing.Image.FromStream(origImageStream); 
    jpgImage.Save(jpgImageStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
    jpgImageBytes = jpgImageStream.ToArray(); 
    jpgImage.Dispose(); 
} 
+0

Если вы урождённый d, чтобы отрегулировать уровень сжатия при записи jpeg, см. [Как установить уровень сжатия JPEG] (http://msdn.microsoft.com/en-us/library/bb882583.aspx) – Oliver

+0

Вы можете установить jpgImage переменную также в оператор using, и поэтому удалите вызов jpgImage.Dispose(). – Oliver

2

Бит Поздний ответ, но это должно помочь другим. В этом решении не имеет значения, какой тип изображения он (до тех пор, как это изображение можно преобразовать в любой тип.

public static byte[] ConvertImageBytes(byte[] imageBytes, ImageFormat imageFormat) 
     { 
      byte[] byteArray = new byte[0]; 
      FileStream stream = new FileStream("empty." + imageFormat, FileMode.Create); 
      using (MemoryStream ms = new MemoryStream(imageBytes)) 
      { 
       stream.Write(byteArray, 0, byteArray.Length); 
       byte[] buffer = new byte[16 * 1024]; 
       int read; 
       while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        ms.Write(buffer, 0, read); 
       } 
       byteArray = ms.ToArray(); 
       stream.Close(); 
       ms.Close(); 
      } 
      return byteArray; 
     } 

Используйте его как ниже

ConvertImageBytes(imageBytes, ImageFormat.Png); 
+0

Спасибо за это! Это очень полезно! Первоначально, когда я смотрел на это, я надеялся на решение, которое не нужно было записывать на диск. –

+1

@RobMcCabe Рад помочь –

Смежные вопросы