我使用16位颜色。当我将颜色转换为rgb888(每种颜色8位)然后再转换为rgb565(红色为5位,绿色为6位,蓝色为5位)时,即使没有对颜色执行任何操作,也会得到稍暗/灰色的图像。 / p>
以下是我的功能:
private static Vector3 col = new Vector3();
public static Vector3 ShortToRGB888( short color )
{
float r = (float)((color & 0xF800) >> 8);
float g = (float)((color & 0x07E0) >> 3);
float b = (float)((color & 0x001F) << 3);
col.set(r, g, b);
return col;
}
public static short RGB888ToShort( Vector3 col )
{
col.clamp(0f, 255f);
int result = (((int)col.x) << 8) & 0xF800;
result |= (((int)col.y) << 3) & 0x07E0;
result |= (((int)col.z) >> 3) & 0x001F;
return (short)result;
}
可能是什么问题?我在这里查看了一个类似的问题之后,我找不到任何有关位移的问题: Why does converting RGB888 to RGB565 many times cause loss of colour?
我开始怀疑转换为浮动和从浮动转换。
修改
short orig = data[tx][ty][tz]; // 16 bit short
Vector3f color = ColorConversion.ShortToRGB888(orig);
short ne = ColorConversion.RGB888ToShort(color);
if (ne != orig) {
ErrorHandler.log("Orig: " + orig + " New: " + ne);
}
Yields the following mismatches:
Canvasland: CL-ERROR - Orig: 23900 New: 19608
Canvasland: CL-ERROR - Orig: 23864 New: 21750
Canvasland: CL-ERROR - Orig: 23831 New: 21750
Canvasland: CL-ERROR - Orig: 23742 New: 19449
Canvasland: CL-ERROR - Orig: 23870 New: 19545
Canvasland: CL-ERROR - Orig: 23768 New: 21687
Canvasland: CL-ERROR - Orig: 23707 New: 21561
Canvasland: CL-ERROR - Orig: 23802 New: 21656
Canvasland: CL-ERROR - Orig: 23549 New: 21402
Canvasland: CL-ERROR - Orig: 23165 New: 21084
Canvasland: CL-ERROR - Orig: 23069 New: 20988
Canvasland: CL-ERROR - Orig: 22395 New: 15796
Canvasland: CL-ERROR - Orig: 22223 New: 20142
Canvasland: CL-ERROR - Orig: 23679 New: 19386
Canvasland: CL-ERROR - Orig: 23292 New: 21211
Canvasland: CL-ERROR - Orig: 22515 New: 18063
Canvasland: CL-ERROR - Orig: 23834 New: 21655
Canvasland: CL-ERROR - Orig: 23711 New: 19418
Canvasland: CL-ERROR - Orig: 22975 New: 20893
Canvasland: CL-ERROR - Orig: 22487 New: 15922
Canvasland: CL-ERROR - Orig: 23709 New: 19449
Canvasland: CL-ERROR - Orig: 23643 New: 21529
Canvasland: CL-ERROR - Orig: 22362 New: 15796
Canvasland: CL-ERROR - Orig: 23770 New: 21624
Canvasland: CL-ERROR - Orig: 22478 New: 18156
Canvasland: CL-ERROR - Orig: 23768 New: 21687
Canvasland: CL-ERROR - Orig: 23643 New: 21529
Canvasland: CL-ERROR - Orig: 23103 New: 20989
Canvasland: CL-ERROR - Orig: 23768 New: 21687
Canvasland: CL-ERROR - Orig: 23705 New: 21624
Canvasland: CL-ERROR - Orig: 23673 New: 21592
Canvasland: CL-ERROR - Orig: 23578 New: 21497
Canvasland: CL-ERROR - Orig: 23514 New: 21433
Canvasland: CL-ERROR - Orig: 22525 New: 15797
Canvasland: CL-ERROR - Orig: 23870 New: 19545
Canvasland: CL-ERROR - Orig: 23801 New: 21687
Canvasland: CL-ERROR - Orig: 23614 New: 19386
Canvasland: CL-ERROR - Orig: 23037 New: 20956
Canvasland: CL-ERROR - Orig: 23518 New: 19323
Canvasland: CL-ERROR - Orig: 23390 New: 21275
答案 0 :(得分:0)
将RGB888转换为RGB565时,您将自然失去最低位:
来回转换,与简单地屏蔽RGB565格式中不存在的位具有相同的效果:RGB888&amp; = 0xF8FCF8。那里显然有信息丢失(自然)。
(当我说低3位时,我的意思是红色/蓝色通道,绿色通道用2代替)
删除3个较低位会使颜色通道(最多)变暗7/256,这样会使1/32变得粗糙,并且通常足以在屏幕上并排看到原始颜色和重建颜色时感知到。在具有精细渐变的图片中,它还经常会引入可见的条带效果(渐变成为一组清晰可辨的区域)。
由于损耗取决于每个通道的实际值,因此每个通道的音调也可能会有所不同,具体取决于低3位的状态。
答案 1 :(得分:0)
我明白了。功能钳不能达到我的预期。
col.clamp(0f, 255f);
我将更改它以使用Math.min和Math.max。