2014-04-16 2 views
6

PreviewCall 뒷면에서 우리는 카메라 미리보기에서 YUV420SP 형식을 얻고 있습니다. 그러나 이미지의 잘못된 회전으로 인해 네트워크를 통해 전송해야하므로 YUV 이미지의 올바른 회전을 수행하려고합니다. 정확한 회전이 적용될 필요가있다.안드로이드에서 YUV420/NV21 이미지 회전

이 링크는 정확한 회전을하지만 이미지의 색상이 느슨합니다.

http://www.wordsaretoys.com/2013/10/25/roll-that-camera-zombie-rotation-and-coversion-from-yv12-to-yuv420planar/

Rotate an YUV byte array on Android을 확인하지만 제대로 이미지를 표시하지 않습니다.

나는 stckoverflow에서 링크를 확인했지만 그 중 누구도 안드로이드 환경에서 코드를 올바르게 사용하는 것에 대한 만족스러운 대답을 갖고 있지 않습니다.

NV21 Image bytes []를 올바르게 회전시켜 색상 정보를 올바르게 유지하는 방법에 대해 알고있는 사람이 있습니까?

+0

원시 코드 또는 Java를 찾고 계십니까? YUV 평면 이미지의 형식을 완전히 이해하고 있습니까? 루마면은 전방에 있으며 채도면이 뒤 따른다. – spartygw

답변

7

NV21을 회전 시키려면 다음 코드가 유용합니다. (코드를 수정했습니다 from here)

public static void rotateNV21(byte[] input, byte[] output, int width, int height, int rotation) { 
     boolean swap = (rotation == 90 || rotation == 270); 
     boolean yflip = (rotation == 90 || rotation == 180); 
     boolean xflip = (rotation == 270 || rotation == 180); 
     for (int x = 0; x < width; x++) { 
      for (int y = 0; y < height; y++) { 
       int xo = x, yo = y; 
       int w = width, h = height; 
       int xi = xo, yi = yo; 
       if (swap) { 
        xi = w * yo/h; 
        yi = h * xo/w; 
       } 
       if (yflip) { 
        yi = h - yi - 1; 
       } 
       if (xflip) { 
        xi = w - xi - 1; 
       } 
       output[w * yo + xo] = input[w * yi + xi]; 
       int fs = w * h; 
       int qs = (fs >> 2); 
       xi = (xi >> 1); 
       yi = (yi >> 1); 
       xo = (xo >> 1); 
       yo = (yo >> 1); 
       w = (w >> 1); 
       h = (h >> 1); 
       // adjust for interleave here 
       int ui = fs + (w * yi + xi) * 2; 
       int uo = fs + (w * yo + xo) * 2; 
       // and here 
       int vi = ui + 1; 
       int vo = uo + 1; 
       output[uo] = input[ui]; 
       output[vo] = input[vi]; 
      } 
     } 
    } 
+0

180도 회전이 가능하지만 90도 및 270도 회전으로 이미지가 왜곡됩니다. –

+0

나는 그것을 270도 시도해 보았고 그 그림의 크기가 여전히 문제가된다는 것을 발견했다. –

관련 문제