Some people suggest that to convert RGB555 to RGB888, one propagates the highest bits down, however, even though this method preserves full range (as opposed to left-shit by 3 which does not), this approach introduces noise from the highest bits.
Myself, I use the formula x * 255 / 31 which preserves full range and does not introduce noise from the highest bits.
This small test shows the difference between the two approaches:
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class ColorTest
{
public TestContext TestContext { get; set; }
[TestMethod]
public void Test1()
{
for (var i = 0; i < 32; i++)
{
var j = i * 255 / 31;
var k = (i << 3) | ((i >> 2) & 0b111);
TestContext.WriteLine($"{j,3} -> {k,3}, difference: {k - j}");
}
}
}
Result:
TestContext Messages:
0 -> 0, difference: 0
8 -> 8, difference: 0
16 -> 16, difference: 0
24 -> 24, difference: 0
32 -> 33, difference: 1
41 -> 41, difference: 0
49 -> 49, difference: 0
57 -> 57, difference: 0
65 -> 66, difference: 1
74 -> 74, difference: 0
82 -> 82, difference: 0
90 -> 90, difference: 0
98 -> 99, difference: 1
106 -> 107, difference: 1
115 -> 115, difference: 0
123 -> 123, difference: 0
131 -> 132, difference: 1
139 -> 140, difference: 1
148 -> 148, difference: 0
156 -> 156, difference: 0
164 -> 165, difference: 1
172 -> 173, difference: 1
180 -> 181, difference: 1
189 -> 189, difference: 0
197 -> 198, difference: 1
205 -> 206, difference: 1
213 -> 214, difference: 1
222 -> 222, difference: 0
230 -> 231, difference: 1
238 -> 239, difference: 1
246 -> 247, difference: 1
255 -> 255, difference: 0
Question:
Which approach is correct in definitive?