基础函数:YUV与RGB的转换

  1. //File : img.h
  2. //Author : Loonzhong <sepnic@gmail.com>

  3. #ifndef __IMG_H
  4. #define __IMG_H


  5. class img {
  6. public:
  7.     img() {};
  8.     ~img() {};
  9.     
  10.     void yuv_to_rgb16(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb);
  11.     void yuv_to_rgb32(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb);

  12. private:
  13.     
  14. };


  15. #endif /* __IMG_H */
  1. //File : img.cpp
  2. //Author : Loonzhong <sepnic@gmail.com>

  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <stdio.h>
  6. #include <fcntl.h>
  7. #include <sys/ioctl.h>
  8. #include <string.h>
  9. #include <errno.h>

  10. #include "img.h"

  11. void img::yuv_to_rgb16(unsigned char y,
  12.                        unsigned char u,
  13.                        unsigned char v,
  14.                        unsigned char *rgb)
  15. {
  16.     register int r, g, b;
  17.     int rgb16;

  18.     r = (1192 * (y - 16) + 1634 * (v - 128) ) >> 10;
  19.     g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u -128) ) >> 10;
  20.     b = (1192 * (y - 16) + 2066 * (u - 128) ) >> 10;

  21.     r = r > 255 ? 255 : r < 0 ? 0 : r;
  22.     g = g > 255 ? 255 : g < 0 ? 0 : g;
  23.     b = b > 255 ? 255 : b < 0 ? 0 : b;

  24.     rgb16 = (int)(((r >> 3)<<11) | ((g >> 2) << 5)| ((b >> 3) << 0));

  25.     *(rgb++) = (unsigned char)(rgb16 & 0xFF);
  26.     *(rgb++) = (unsigned char)((rgb16 & 0xFF00) >> 8);
  27. }

  28. void img::yuv_to_rgb32(unsigned char y,
  29.                        unsigned char u,
  30.                        unsigned char v,
  31.                        unsigned char *rgb)
  32. {
  33.     register int r, g, b;

  34.         r = (y + (359 * v)) >> 8;
  35.         g = (y - (88 * u) - (183 * v)) >> 8;
  36.         b = (y + (454 * u)) >> 8;
  37.         
  38.         b = (b > 255) ? 255 : ((b < 0) ? 0 : b);
  39.         g = (g > 255) ? 255 : ((g < 0) ? 0 : g);
  40.         r = (r > 255) ? 255 : ((r < 0) ? 0 : r);
  41.         
  42.         *(rgb++) = b;
  43.         *(rgb++) = g;
  44.         *(rgb++) = r;
  45.         *(rgb++) = 0x0;
  46. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值