php 转化 rgb标准格式,各种RGB格式转换的代码

// 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值