Maison > Questions et réponses > le corps du texte
用surfaceview获取到YUV类型的byte[]数据如何进行YUV转RGB转Bitmap转BGRA的过程?
希望有大神贴点代码,或者给一些相关资料借鉴下。
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.
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.
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
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/...
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.