2014-04-16 13 views
6

In PreviewCall Rückseite der Oberfläche bekommen wir YUV420SP Format in der Kamera Vorschau, aber wegen der falschen Drehung dieses Bildes möchte ich korrekte Drehung des YUV-Bildes durchführen, wie ich es über network.so senden muss korrekte Rotation muss angewendet werden.Drehen YUV420/NV21 Bild in android

Ich fand diesen Link, es tut richtige Rotation aber Bild verlieren die Farbe.

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

auch geprüft Rotate an YUV byte array on Android aber es zeigt nicht richtig Bild.

Ich habe Links auf Stckoverflow überprüft, aber keine von ihnen haben zufriedenstellende Antwort über die korrekte Verwendung des Codes in Android-Umgebung.

haben Sie eine Idee, wie NV21 Image Bytes [] korrekt mit korrekten Farbinformationen zu drehen.

+0

Suchen Sie nach nativem Code oder Java? Verstehen Sie das Format eines YUV-Planars vollständig? Die Luma-Ebene befindet sich an der Vorderseite, gefolgt von der Chroma-Ebene. – spartygw

Antwort

7

Wenn Sie nur NV21 drehen möchten, wird der folgende Code hilfreich sein. (Ich änderte den Code 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

Dies scheint für 180 Degs zu arbeiten, aber die Drehung von 90 und 270 Grad lässt das Bild verzerrt. –

+0

Ich habe es für 270 Grad probiert und dabei das Problem entdeckt, dass die Bildgröße still steht. –