2014-04-16 12 views
6

In PreviewCall retro della superficie riceviamo il formato YUV420SP nell'anteprima della fotocamera ma a causa di una rotazione errata di quell'immagine voglio eseguire la rotazione corretta dell'immagine YUV in quanto ho bisogno di inviarlo tramite network.so è necessario applicare la rotazione corretta.Ruota immagine YUV420/NV21 in android

Ho trovato questo collegamento che corregge la rotazione ma l'immagine perde il colore.

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

anche controllato Rotate an YUV byte array on Android ma non mostra l'immagine correttamente.

Ho controllato i collegamenti su stckoverflow ma nessuno di loro ha una risposta soddisfacente riguardo l'uso corretto del codice nell'ambiente Android.

qualcuno ha idea di come ruotare correttamente NV21 Image bytes [] mantenendo le informazioni sul colore corrette.

+0

Stai cercando codice nativo o Java? Comprendi pienamente il formato di un'immagine planare YUV? Il piano luma è in primo piano seguito dal piano chroma. – spartygw

risposta

7

Se si desidera ruotare NV21, il codice seguente sarà utile. (Ho modificato il codice 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

Questo sembra funzionare per 180 gradi, ma la rotazione di 90 e 270 gradi lascia l'immagine distorta. –

+0

L'ho provato per 270 gradi e ho scoperto il problema che la dimensione dell'immagine è ancora ferma. –