java - Android surfaceview获取的YUV数据如何进行YUV转RGB转Bitmap转BGRA?
怪我咯
怪我咯 2017-04-18 10:49:03
0
1
876

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

怪我咯
怪我咯

走同样的路,发现不同的人生

répondre à tous(1)
PHPzhong

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal