📄 rgb2rgb.c
字号:
/** * Palette is assumed to contain BGR32. */void palette8torgb24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette){ long i;/* writes 1 byte o much and might cause alignment issues on some architectures? for (i=0; i<num_pixels; i++) ((unsigned *)(&dst[i*3])) = ((unsigned *)palette)[ src[i] ];*/ for (i=0; i<num_pixels; i++) { //FIXME slow? dst[0]= palette[ src[i]*4+2 ]; dst[1]= palette[ src[i]*4+1 ]; dst[2]= palette[ src[i]*4+0 ]; dst+= 3; }}void palette8tobgr24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette){ long i;/* writes 1 byte o much and might cause alignment issues on some architectures? for (i=0; i<num_pixels; i++) ((unsigned *)(&dst[i*3])) = ((unsigned *)palette)[ src[i] ];*/ for (i=0; i<num_pixels; i++) { //FIXME slow? dst[0]= palette[ src[i]*4+0 ]; dst[1]= palette[ src[i]*4+1 ]; dst[2]= palette[ src[i]*4+2 ]; dst+= 3; }}/** * Palette is assumed to contain bgr16, see rgb32to16 to convert the palette */void palette8torgb16(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette){ long i; for (i=0; i<num_pixels; i++) ((uint16_t *)dst)[i] = ((uint16_t *)palette)[ src[i] ];}void palette8tobgr16(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette){ long i; for (i=0; i<num_pixels; i++) ((uint16_t *)dst)[i] = bswap_16(((uint16_t *)palette)[ src[i] ]);}/** * Palette is assumed to contain BGR15, see rgb32to15 to convert the palette. */void palette8torgb15(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette){ long i; for (i=0; i<num_pixels; i++) ((uint16_t *)dst)[i] = ((uint16_t *)palette)[ src[i] ];}void palette8tobgr15(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette){ long i; for (i=0; i<num_pixels; i++) ((uint16_t *)dst)[i] = bswap_16(((uint16_t *)palette)[ src[i] ]);}void rgb32tobgr24(const uint8_t *src, uint8_t *dst, long src_size){ long i; long num_pixels = src_size >> 2; for (i=0; i<num_pixels; i++) { #ifdef WORDS_BIGENDIAN /* RGB32 (= A,B,G,R) -> BGR24 (= B,G,R) */ dst[3*i + 0] = src[4*i + 1]; dst[3*i + 1] = src[4*i + 2]; dst[3*i + 2] = src[4*i + 3]; #else dst[3*i + 0] = src[4*i + 2]; dst[3*i + 1] = src[4*i + 1]; dst[3*i + 2] = src[4*i + 0]; #endif }}void rgb24tobgr32(const uint8_t *src, uint8_t *dst, long src_size){ long i; for (i=0; 3*i<src_size; i++) { #ifdef WORDS_BIGENDIAN /* RGB24 (= R,G,B) -> BGR32 (= A,R,G,B) */ dst[4*i + 0] = 0; dst[4*i + 1] = src[3*i + 0]; dst[4*i + 2] = src[3*i + 1]; dst[4*i + 3] = src[3*i + 2]; #else dst[4*i + 0] = src[3*i + 2]; dst[4*i + 1] = src[3*i + 1]; dst[4*i + 2] = src[3*i + 0]; dst[4*i + 3] = 0; #endif }}void rgb16tobgr32(const uint8_t *src, uint8_t *dst, long src_size){ const uint16_t *end; uint8_t *d = (uint8_t *)dst; const uint16_t *s = (uint16_t *)src; end = s + src_size/2; while (s < end) { register uint16_t bgr; bgr = *s++; #ifdef WORDS_BIGENDIAN *d++ = 0; *d++ = (bgr&0x1F)<<3; *d++ = (bgr&0x7E0)>>3; *d++ = (bgr&0xF800)>>8; #else *d++ = (bgr&0xF800)>>8; *d++ = (bgr&0x7E0)>>3; *d++ = (bgr&0x1F)<<3; *d++ = 0; #endif }}void rgb16tobgr24(const uint8_t *src, uint8_t *dst, long src_size){ const uint16_t *end; uint8_t *d = (uint8_t *)dst; const uint16_t *s = (const uint16_t *)src; end = s + src_size/2; while (s < end) { register uint16_t bgr; bgr = *s++; *d++ = (bgr&0xF800)>>8; *d++ = (bgr&0x7E0)>>3; *d++ = (bgr&0x1F)<<3; }}void rgb16tobgr16(const uint8_t *src, uint8_t *dst, long src_size){ long i; long num_pixels = src_size >> 1; for (i=0; i<num_pixels; i++) { unsigned b,g,r; register uint16_t rgb; rgb = src[2*i]; r = rgb&0x1F; g = (rgb&0x7E0)>>5; b = (rgb&0xF800)>>11; dst[2*i] = (b&0x1F) | ((g&0x3F)<<5) | ((r&0x1F)<<11); }}void rgb16tobgr15(const uint8_t *src, uint8_t *dst, long src_size){ long i; long num_pixels = src_size >> 1; for (i=0; i<num_pixels; i++) { unsigned b,g,r; register uint16_t rgb; rgb = src[2*i]; r = rgb&0x1F; g = (rgb&0x7E0)>>5; b = (rgb&0xF800)>>11; dst[2*i] = (b&0x1F) | ((g&0x1F)<<5) | ((r&0x1F)<<10); }}void rgb15tobgr32(const uint8_t *src, uint8_t *dst, long src_size){ const uint16_t *end; uint8_t *d = (uint8_t *)dst; const uint16_t *s = (const uint16_t *)src; end = s + src_size/2; while (s < end) { register uint16_t bgr; bgr = *s++; #ifdef WORDS_BIGENDIAN *d++ = 0; *d++ = (bgr&0x1F)<<3; *d++ = (bgr&0x3E0)>>2; *d++ = (bgr&0x7C00)>>7; #else *d++ = (bgr&0x7C00)>>7; *d++ = (bgr&0x3E0)>>2; *d++ = (bgr&0x1F)<<3; *d++ = 0; #endif }}void rgb15tobgr24(const uint8_t *src, uint8_t *dst, long src_size){ const uint16_t *end; uint8_t *d = (uint8_t *)dst; const uint16_t *s = (uint16_t *)src; end = s + src_size/2; while (s < end) { register uint16_t bgr; bgr = *s++; *d++ = (bgr&0x7C00)>>7; *d++ = (bgr&0x3E0)>>2; *d++ = (bgr&0x1F)<<3; }}void rgb15tobgr16(const uint8_t *src, uint8_t *dst, long src_size){ long i; long num_pixels = src_size >> 1; for (i=0; i<num_pixels; i++) { unsigned b,g,r; register uint16_t rgb; rgb = src[2*i]; r = rgb&0x1F; g = (rgb&0x3E0)>>5; b = (rgb&0x7C00)>>10; dst[2*i] = (b&0x1F) | ((g&0x3F)<<5) | ((r&0x1F)<<11); }}void rgb15tobgr15(const uint8_t *src, uint8_t *dst, long src_size){ long i; long num_pixels = src_size >> 1; for (i=0; i<num_pixels; i++) { unsigned b,g,r; register uint16_t rgb; rgb = src[2*i]; r = rgb&0x1F; g = (rgb&0x3E0)>>5; b = (rgb&0x7C00)>>10; dst[2*i] = (b&0x1F) | ((g&0x1F)<<5) | ((r&0x1F)<<10); }}void rgb8tobgr8(const uint8_t *src, uint8_t *dst, long src_size){ long i; long num_pixels = src_size; for (i=0; i<num_pixels; i++) { unsigned b,g,r; register uint8_t rgb; rgb = src[i]; r = (rgb&0x07); g = (rgb&0x38)>>3; b = (rgb&0xC0)>>6; dst[i] = ((b<<1)&0x07) | ((g&0x07)<<3) | ((r&0x03)<<6); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -