织梦CMS - 轻松建站从此开始!

罗索

各种RGB格式转换的代码

罗索客 发布于 2009-11-27 14:14 点击:次 
各种RGB格式转换的代码
TAG:

// Contact:   70565912@qq.com
//////////////////////////////////////////////////////////////////////////
#pragma once

/* C99 types */
typedef unsigned char       uint8_t;
typedef signed char         int8_t;
typedef unsigned short      uint16_t;
typedef signed short        int16_t;
typedef unsigned int        uint32_t;
typedef signed int          int32_t;
typedef unsigned __int64    uint64_t;
typedef signed __int64      int64_t;
typedef uint32_t            uintptr_t;
typedef int32_t             intptr_t;

typedef void (*rgb_piexl_p)(uint8_t*&, const uint8_t*&);

static void inline rgb_line(uint8_t* dst, uint32_t dst_pitch,
       const uint8_t* src, uint32_t width, uint32_t height, uint32_t src_pitch, rgb_piexl_p p_rgb_piexl)
{
 uint8_t *d = dst;
 uint8_t *d_line = dst;

 const uint8_t *s = src;
 const uint8_t *s_line = src;
 const uint8_t *end = src + src_pitch*height;

 uint32_t i;

 while (s < end)
 {
  for (i = 0; i < width; i++) {
   p_rgb_piexl(d, s);
  }

  s_line += src_pitch;
  d_line += dst_pitch;
  s = s_line;
  d = d_line;
 }
}

//////////////////////////////////////////////////////////////////////////
static void inline rgb_piexl_16to32(uint8_t *&d, const uint8_t *&s)
{
 uint16_t rgb = *((uint16_t*)s);
 *d++ = (rgb&0x1F)<<3; //b
 *d++ = (rgb&0x7E0)>>3; //g
 *d++ = (rgb&0xF800)>>8; //r
 *d++ = 255;
 s+=2;
}

static void inline rgb_piexl_16to24(uint8_t *&d, const uint8_t *&s)
{
 uint16_t rgb = *((uint16_t*)s);
 *d++ = (rgb&0x1F)<<3; //b
 *d++ = (rgb&0x7E0)>>3; //g
 *d++ = (rgb&0xF800)>>8; //r
 s+=2;
}
static void inline rgb_piexl_16to16(uint8_t *&d, const uint8_t *&s)
{
 d[ 0 ] = s[ 0 ];
 d[ 1 ] = s[ 1 ];
 d += 2;
 s += 2;
}

static void inline rgb_piexl_16to15(uint8_t *&d, const uint8_t *&s)
{
 uint16_t rgb = *((uint16_t*)s);
 *((uint16_t*)d) = (rgb&0x1F) | ((rgb&0x7C0)>>1) | ((rgb&0xF800)>>1);
 d += 2;
 s += 2;
}

#define rgb16to32(dst, dst_pitch, src, width, height, src_pitch) \
 rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_16to32);

#define rgb16to24(dst, dst_pitch, src, width, height, src_pitch) \
 rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_16to24);

#define rgb16to16(dst, dst_pitch, src, width, height, src_pitch) \
 rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_16to16);

#define rgb16to15(dst, dst_pitch, src, width, height, src_pitch) \
 rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_16to15);

//////////////////////////////////////////////////////////////////////////
static void inline rgb_piexl_24to32(uint8_t *&d, const uint8_t *&s)
{
 d[ 0 ] = s[ 0 ]; //b
 d[ 1 ] = s[ 1 ]; //g
 d[ 2 ] = s[ 2 ]; //r
 d[ 3 ] = 255;  //a
 s += 3;
 d += 4;
}

static void inline rgb_piexl_24to24(uint8_t *&d, const uint8_t *&s)
{
 d[ 0 ] = s[ 0 ]; //b
 d[ 1 ] = s[ 1 ]; //g
 d[ 2 ] = s[ 2 ]; //r
 s += 3;
 d += 3;
}

static void inline rgb_piexl_24to16(uint8_t *&d, const uint8_t *&s)
{
 uint32_t rgb = *((uint32_t*)s);
 *((uint16_t*)d) = ((rgb&0xF8)>>3) | ((rgb&0xFC00)>>5) | ((rgb&0xF80000)>>8);
 d += 2;
 s += 3;
}

static void inline rgb_piexl_24to15(uint8_t *&d, const uint8_t *&s)
{
 uint32_t rgb = *(uint32_t*)s;
 *((uint16_t*)d) = (rgb&0xF8>>3) | ((rgb&0xF800)>>6) | ((rgb&0xF80000)>>9);
 s += 4;
 d += 2;
}

#define rgb24to32(dst, dst_pitch, src, width, height, src_pitch) \
 rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_24to32);

#define rgb24to24(dst, dst_pitch, src, width, height, src_pitch) \
 rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_24to24);

#define rgb24to16(dst, dst_pitch, src, width, height, src_pitch) \
 rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_24to16);

#define rgb24to15(dst, dst_pitch, src, width, height, src_pitch) \
 rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_24to15);


//////////////////////////////////////////////////////////////////////////
static void inline rgb_piexl_32to32(uint8_t *&d, const uint8_t *&s)
{
 d[ 0 ] = s[ 0 ]; //b
 d[ 1 ] = s[ 1 ]; //g
 d[ 2 ] = s[ 2 ]; //r
 d[ 3 ] = s[ 3 ]; //a
 s += 4;
 d += 4;
}

static void inline rgb_piexl_32to24(uint8_t *&d, const uint8_t *&s)
{
 d[ 0 ] = s[ 0 ]; //b
 d[ 1 ] = s[ 1 ]; //g
 d[ 2 ] = s[ 2 ]; //r
 s += 4;
 d += 3;
}

static void inline rgb_piexl_32to16(uint8_t *&d, const uint8_t *&s)
{
 uint32_t rgb = *((uint32_t*)s);
 *((uint16_t*)d) = ((rgb&0xF8)>>3) | ((rgb&0xFC00)>>5) | ((rgb&0xF80000)>>8);
 d += 2;
 s += 4;
}

static void inline rgb_piexl_32to15(uint8_t *&d, const uint8_t *&s)
{
 uint32_t rgb = *(uint32_t*)s;
 *((uint16_t*)d) = ((rgb&0xF8)>>3) | ((rgb&0xF800)>>6) | ((rgb&0xF80000)>>9);
 s += 4;
 d += 2;
}

#define rgb32to32(dst, dst_pitch, src, width, height, src_pitch) \
 rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_32to32);

#define rgb32to24(dst, dst_pitch, src, width, height, src_pitch) \
 rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_32to24);

#define rgb32to16(dst, dst_pitch, src, width, height, src_pitch) \
 rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_32to16);

#define rgb32to15(dst, dst_pitch, src, width, height, src_pitch) \
 rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_32to15);
 

(JackyHwei)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200911/8023.html]
本文出处: 作者:JackyHwei
顶一下
(4)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
发布者资料
JackyHwei 查看详细资料 发送留言 加为好友 用户等级:中级会员 注册时间:2005-11-30 00:11 最后登录:2013-05-09 20:05
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容