Konvertieren von Bitmap-Array in YUV (YCbCr NV21)

Wie konvertiere BitmapFactory.decodeFile() Bitmap, die von BitmapFactory.decodeFile() in das YUV-Format zurückgegeben wird (simillar, welche Kamera onPreviewFrame () in Byte-Array zurückgibt)?

  • Objekt-Erkennung mit OpenCV SVM
  • Senden von utf8-Inhalten mit Post-Methode auf Server in Android mit HttpClient
  • Kundenspezifische linting lib in android
  • Was ist der beste Weg, um zwischen Android und Oracle-Datenbank zu verbinden?
  • Slide Toggle für Android
  • Android-Service stoppt
  • Ist es möglich, die "Popular times" Informationen über die Google Places API zu erhalten
  • Extrahieren von Android .apk und Lesen von Inhalt der XML-Datei in res / layout
  • Ein Bild aus der Galerie aus dem Picasa // Google + synchronisierte Ordner funktioniert nicht
  • Wie erkennt man HTC Sense?
  • Android Marshmallow, "gefährliche" Schutzstufe und Systemkomponenten / Apps
  • ADB startet nicht (keine Fehlermeldung)
  • 4 Solutions collect form web for “Konvertieren von Bitmap-Array in YUV (YCbCr NV21)”

    Hier ist ein Code, der eigentlich funktioniert:

      // untested function byte [] getNV21(int inputWidth, int inputHeight, Bitmap scaled) { int [] argb = new int[inputWidth * inputHeight]; scaled.getPixels(argb, 0, inputWidth, 0, 0, inputWidth, inputHeight); byte [] yuv = new byte[inputWidth*inputHeight*3/2]; encodeYUV420SP(yuv, argb, inputWidth, inputHeight); scaled.recycle(); return yuv; } void encodeYUV420SP(byte[] yuv420sp, int[] argb, int width, int height) { final int frameSize = width * height; int yIndex = 0; int uvIndex = frameSize; int a, R, G, B, Y, U, V; int index = 0; for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { a = (argb[index] & 0xff000000) >> 24; // a is not used obviously R = (argb[index] & 0xff0000) >> 16; G = (argb[index] & 0xff00) >> 8; B = (argb[index] & 0xff) >> 0; // well known RGB to YUV algorithm Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16; U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128; V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128; // NV21 has a plane of Y and interleaved planes of VU each sampled by a factor of 2 // meaning for every 4 Y pixels there are 1 V and 1 U. Note the sampling is every other // pixel AND every other scanline. yuv420sp[yIndex++] = (byte) ((Y < 0) ? 0 : ((Y > 255) ? 255 : Y)); if (j % 2 == 0 && index % 2 == 0) { yuv420sp[uvIndex++] = (byte)((V<0) ? 0 : ((V > 255) ? 255 : V)); yuv420sp[uvIndex++] = (byte)((U<0) ? 0 : ((U > 255) ? 255 : U)); } index ++; } } } 

    Im Folgenden ist der Code für die Umwandlung von Bitmap in Yuv(NV21) Format.

     void yourFunction(){ // mBitmap is your bitmap int mWidth = mBitmap.getWidth(); int mHeight = mBitmap.getHeight(); int[] mIntArray = new int[mWidth * mHeight]; // Copy pixel data from the Bitmap into the 'intArray' array mBitmap.getPixels(mIntArray, 0, mWidth, 0, 0, mWidth, mHeight); // Call to encoding function : convert intArray to Yuv Binary data encodeYUV420SP(data, intArray, mWidth, mHeight); } static public void encodeYUV420SP(byte[] yuv420sp, int[] rgba, int width, int height) { final int frameSize = width * height; int[] U, V; U = new int[frameSize]; V = new int[frameSize]; final int uvwidth = width / 2; int r, g, b, y, u, v; for (int j = 0; j < height; j++) { int index = width * j; for (int i = 0; i < width; i++) { r = Color.red(rgba[index]); g = Color.green(rgba[index]); b = Color.blue(rgba[index]); // rgb to yuv y = (66 * r + 129 * g + 25 * b + 128) >> 8 + 16; u = (-38 * r - 74 * g + 112 * b + 128) >> 8 + 128; v = (112 * r - 94 * g - 18 * b + 128) >> 8 + 128; // clip y yuv420sp[index] = (byte) ((y < 0) ? 0 : ((y > 255) ? 255 : y)); U[index] = u; V[index++] = v; } } 

    Die bmp-Datei wird im RGB888-Format sein, also musst du es in YUV umwandeln. Ich habe nicht auf irgendeine api in Android gekommen, die dieses für Sie tun wird.

    Aber du kannst das selbst tun, sehe diesen Link, wie man ..

    Zuerst berechnen Sie die rgb-Daten:

     r=(p>>16) & 0xff; g=(p>>8) & 0xff; b= p & 0xff; y=0.2f*r+0.7*g+0.07*b; u=-0.09991*r-0.33609*g+0.436*b; v=0.615*r-0.55861*g-0.05639*b; 

    Y, u und v sind die Komponisten der yuv-Matrix.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.