Maison  >  Questions et réponses  >  le corps du texte

java - Android surfaceview获取的YUV数据如何进行YUV转RGB转Bitmap转BGRA?

用surfaceview获取到YUV类型的byte[]数据如何进行YUV转RGB转Bitmap转BGRA的过程?
希望有大神贴点代码,或者给一些相关资料借鉴下。

怪我咯怪我咯2714 Il y a quelques jours805

répondre à tous(1)je répondrai

  • PHPz

    PHPz2017-04-18 10:51:03

    Je ne sais pas s’il existe une meilleure solution sous Android.
    Si C++ est utilisé pour le traitement, il est recommandé de trouver une bibliothèque pour le faire, comme ffmpeg.

    1. Convertir YUV en RVB

    La formule pour convertir les deux l'un en l'autre est la suivante
    RVB en YUV

        Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
        Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
        Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128

    YUV vers RVB

        B = 1.164(Y - 16)                   + 2.018(U - 128)
        G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
        R = 1.164(Y - 16) + 1.596(V - 128)

    Vous pouvez écrire votre propre code pour l'implémenter ici, ce n'est pas difficile.
    Mais YUV a une variété de formats d'échantillonnage et de méthodes de stockage, donc ce que vous obtenez ici n'est pas suffisant byte[], vous devez également savoir à quoi ressemble YUV.
    Il est donc recommandé de trouver directement un moyen d'obtenir des données de pixels RVB.

    2. RVB vers Bitmap

    Ce RVB a également le même problème, il peut s'agir de RVB565/RGB555/RGB24/RGB32 etc. Encore faut-il savoir à quoi ça ressemble.
    Les bibliothèques d'images générales ont des implémentations liées aux opérations Bitmap, qui peuvent définir directement les données de pixels, je n'en sais rien ici. Par exemple, QBitmap::fromData

    dans Qt

    Si vous souhaitez le faire vous-même, vous devez écrire vous-même l'en-tête du fichier. Pour des informations pertinentes, veuillez vous référer à http://blog.csdn.net/o_sun_o/...

    3. Bitmap vers BGRA

    Si vous faites cela vous-même, prenez simplement les pixels et enregistrez-les vous-même. Tous les canaux Alpha ajoutés sont 0.

    répondre
    0
  • Annulerrépondre