2013-11-21 5 views
0

У меня есть этот код (C#):Изменить формат неуправляемого изображения байтового массива

unsafe private Bitmap Test() 
    { 
     Bitmap test = null; 
     byte[] data = memRenderAll.CurrentData; 
     fixed (byte* m_pBuffer = _data) 
     { 
      using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) 
      { 
       Bitmap a = new Bitmap(720, 576, 2160, System.Drawing.Imaging.PixelFormat.Format24bppRgb, new IntPtr(m_pBuffer)); 
       a.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
       test =(Bitmap) Image.FromStream(ms); 
       a.Dispose(); 
      } 
     } 
     return _test; 
    } 

Спасая поток, как это:

a.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 

Я получаю 10: уменьшение 1 является размером.

Есть ли способ избежать этого:

a.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 

и указать его где-нибудь/как-то:

Bitmap a = new Bitmap(720, 576, 2160, System.Drawing.Imaging.PixelFormat.Format24bppRgb, new IntPtr(m_pBuffer)); 

, как я хотел бы создать битмап только один раз.

спасибо,

Эндрю

+1

Не используйте символы подчеркивания (или 'm_') для префикса локальных имен переменных. Это не имеет никакого смысла и делает код более шумным. Это также сбивает с толку, поскольку такие префиксы традиционно обозначают поля частного класса. –

+0

Это стандарт, который использует эта компания к сожалению. Но я согласен с u. Я поправлю его соответствующим образом (слишком долго работал над этим контрактом, я боюсь) :). –

+0

@MarceloCantos Привет, я действительно собираюсь дать вам большие пальцы вверх для вашего комментария, это потряс меня из-за плохой привычки - спасибо –

ответ

1

Я думаю, что его невозможно TODO в одной строке кода с использованием стандартных System.Drawing.

Вы можете использовать этот конструктор: http://msdn.microsoft.com/en-us/library/zy1a2d14(v=vs.110).aspx Ваш код:

new Bitmap(720, 576, 2160, System.Drawing.Imaging.PixelFormat.Format24bppRgb, new IntPtr(m_pBuffer)); 

Что это значит? Растровое считывание памяти, указанное m_pBuffer, с использованием фиксированной ширины, высоты, шага и формата пикселей. Вы не можете читать его как jpeg, потому что jpeg - изображение, застегивающее fomat. Посмотрите на это: http://en.wikipedia.org/wiki/JPEG#JPEG_codec_example. Jpeg-кодеку нужно все ваше изображение для ziping, оно не может застегнуть части и присоединиться к ним после.

+0

Привет, спасибо, что ответили. Да, глядя на это логично, как и у вас (и я этого не делал :)) Я бы согласился с вами. Спасибо за информацию и ссылку. Все против. –

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