2013-07-03 3 views
1

У меня есть размер изображения 640 x480, и я хочу использовать yv12 в качестве выходного формата. изображение обрабатывается некоторым API, и я хочу получить выход в формате YV12.буфер форматирования в соответствии с форматом YUV420P

Что я пытаюсь на данный момент является то, что

ширина INT = 640;
int height = 480;

байт [] byteArray = новый байт [Convert.ToInt32 ((ширина * высота + (2 * ((ширина * высота)/4))) * 1.5)];

captureDevice.GetPreviewBufferYCbCr (ByteArray,) ");

  int YLength = Convert.ToInt32(width * height * 1.5); 

      // UVlength multipled by 2 because it is for both u and v 
      int UVLength = Convert.ToInt32(2 * (width/2) * (weight/2)) * 1.5); 

      var inputYBuffer = byteArray.AsBuffer(0, YLength); 
      var inputUVBuffer = byteArray.AsBuffer(YLength, UVLength); 


      var inputBuffers = new IBuffer[] { inputYBuffer, inputUVBuffer }; 
      var inputScanlines = new uint[] { (uint)YLength, (uint)UVLength }; 
      /////Creating input buffer that supports Nv12 format 

       Bitmap inputBtm = new Bitmap(
       outputBufferSize, 
       ColorMode.Yvu420Sp, 
       inputScanlines, // 1.5 bytes per pixel in Yuv420Sp mode 
       inputBuffers); 



      //As v length is same as u length in output buffer so v length can be used in both place. 
      int vLength = UVLength/2; 
      var outputYBuffer = byteArray.AsBuffer(0, YLength); 
      var outputVBuffer = byteArray.AsBuffer(YLength, vLength); 
      var outputUBuffer = byteArray.AsBuffer(YLength + vLength, vLength); 

      var outputBuffers = new IBuffer[] { outputYBuffer, outputVBuffer, outputUBuffer }; 
      // 
      var outputScanlines = new uint[] { (uint)YLength, (uint)vLength, (uint)vLength }; 


      Bitmap outputBtm = new Bitmap(
       outputBufferSize, 
       ColorMode.Yuv420P, 
       outputScanlines, 
       outputBuffers);**strong text** 

так, что я хочу спросить, что я создаю в OUTPUTBUFFER правильно в соответствии с форматом YUV420P Существует АНИ, в котором я передаю. входной буфер в NV12, и я предполагаю, что он даст мне выходной буфер в формате YV12 (YUV420P). Так что я создал плоскость Y и имеет width x height x 1.5 байт. 1.5, потому что YV12 - это 12 бит для мата и аналогично U имеет width/2 x height/2 x 1.5 байт, а также V-плоскость. На данный момент меня не волнуют YUV420P и YVU420P, пока мой формат правильный, и i просто нужно поменять местами и U и V самолеты.

+0

Вы можете объяснить, почему у вас есть: - byte [] byteArray = новый байт [Convert.ToInt32 ((ширина * высота + (2 * ((ширина * высота)/4))) * 1.5)]; – ashishdhiman2007

ответ

6

YUV 4: 2: 0 планарного выглядит следующим образом:

---------------------- 
|  Y  | Cb|Cr | 
---------------------- 

где:

Y = width x height pixels (bytes) 
Cb = Y/4 pixels (bytes) 
Cr = Y/4 pixels (bytes) 

Total num pixels (bytes) = width * height * 3/2 

Это, как пиксели размещены в 4: 2: 0 подвыборки:

420

Как вы можете видеть, каждое значение цветности делится между 4 пикселями яркости.

+1

Отличный ответ. Спасибо Fredrik. – Whoami