ARGB8888和ARGB1555格式互转


前言

最近在研究图像颜色格式,需要用到图像颜色格式转换,记录在此。


一、RGB 颜色空间

  • RGB颜色空间以R(Red:红)、G(Green:绿)、B(Blue:蓝)三种基本色为基础,进行不同程度的叠加,从而产生丰富多彩的颜色,俗称三基色模式。
  • 科学家发现红绿蓝三种颜色按照不同比例合成可以演化成其它任何一种颜色。

二、常见格式

  • RGB888:表示R,G,B分别使用8位表示(1Byte),一共24位(3Bytes),也叫24位宽。
  • RGB565:表示R使用5位表示,G使用6位表示,B使用5位表示,一共16位(2Bytes),16位宽。
  • ARGB1555:表示A(是否透明)使用1位表示,RGB 分别使用5位表示。

三、格式转换

由大转小
例如:RGB888转RGB565
需要量化压缩将8位数据压缩成5位和6位;压缩规则:取高位,例如:8位转5位,取高5位,再将获取到的RGB数据,按照RGB565的顺序排列好。
量化上做了压缩,却损失了精度

由小转大
例如:RGB565转RGB888
需要量化补偿;补偿规则:将原数据填充至高位,对于低位,用原始数据的低位进行补偿,如果仍然有未填充的位,继续使用原始数据的低位进行循环补偿。

四、ARGB8888和ARGB8888互转

#include <stdio.h>
#include <stdint.h>


unsigned int Rgb888toArgb8888(unsigned int rgb24, int a)
{
	if(a <= 0)
		return 0;
	return (a << 24) + rgb24;
}

unsigned int argb1555_to_argbB8888(unsigned short c)
{
    const unsigned int a = c&0x8000, r = c&0x7C00, g = c&0x03E0, b = c&0x1F;
    const unsigned int rgb = (r << 9) | (g << 6) | (b << 3);
    return (a*0x1FE00) | rgb | ((rgb >> 5) & 0x070707);
}

unsigned short argb8888_to_argb1555(unsigned int color)
{
	unsigned int a = (((color&0xff000000)>>24) +127)/255;
	unsigned int r = (((color&0x00ff0000)>>16)*31 +127)/255;
	unsigned int g = (((color&0x0000ff00)>>8)*31 +127)/255;
	unsigned int b = (((color&0x000000ff))*31 +127)/255;

	unsigned short argb1555 = (a << 15) | (r <<  10) | (g << 5) | b;

	return argb1555;
}

int main(int argc, char *argv[])
{
	unsigned int rgb32 = Rgb888toArgb8888(0x92d050, 0xff);
	printf("rgb32:%x\n", rgb32);
	unsigned short argb1555 = argb8888_to_argb1555(rgb32);
	printf("argb1555:%x\n", argb1555);
	unsigned int color = argb1555_to_argbB8888(argb1555);
	printf("argb8888:%x\n", color);
    return 0;
}

五、总结

需要知道的是,从大到小转换会丢失精度,颜色压缩后,跟原来的色彩是有差异的!我这边试着会比原来的色彩偏淡。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫手的热山药

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值