ARGB8888 および ARGB1555 形式の変換


序文

最近画像のカラー フォーマットを研究しており、画像のカラー フォーマット変換を使用する必要があります。これはここに記録されています。


1. RGB色空間

  • RGB 色空間は、R (赤: 赤)、G (緑: 緑)、B (青: 青) の 3 つの基本色に基づいており、これらをさまざまな程度に重ね合わせて豊かでカラフルな色を生成します。三原色モード。
  • 科学者たちは、赤、緑、青の 3 色が異なる割合で合成され、他の色に進化できることを発見しました。

2. 共通フォーマット

  • RGB888: R、G、B がそれぞれ 8 ビット (1 バイト)、合計 24 ビット (3 バイト) で表されることを示し、24 ビット幅とも呼ばれます。
  • RGB565: R が 5 ビット、G が 6 ビット、B が 5 ビット、合計 16 ビット (2Byte)、16 ビット幅で表されることを示します。
  • ARGB1555: A (透明かどうか) が 1 ビット、RGB が 5 ビットでそれぞれ表現されることを示します。

3.フォーマット変換

大きいものから小さいものへ
例: RGB888 から RGB565 では、
8 ビット データを 5 ビットと 6 ビットに圧縮するために量子化圧縮が必要です。圧縮ルール: 上位ビットを取得します。例: 8 ビットを 5 ビットに変換し、上位 5 ビットを取得します。得られたRGBデータをRGB565の順に変換します。
量子化は圧縮されますが、精度は失われます

小さいものから大きいものまで
。例: RGB565 から RGB888 には
量子化補正が必要です。補正ルール: 元のデータを上位ビットまで埋め、下位ビットについては元のデータの下位ビットを使用して補正します。まだ埋められていないビットがある場合は、 、元のデータの下位ビットを使用し続けて循環させます。

4. 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;
}

5. まとめ

知っておく必要があるのは、大きい色から小さい色に変換すると精度が失われ、色圧縮後の色は元の色とは異なることです。今回試した色は元の色よりも明るい色になります。

おすすめ

転載: blog.csdn.net/weixin_37926485/article/details/127862610