这意味着每个像素占用 2 个字节,2 个字节中的 4 位用于填充
嗯,有点。这意味着每个 sample 存储在两个连续的字节中,并带有 4 位填充。但在原始图像中,样本通常不是像素,也不完全是像素。原始图像还没有去马赛克,毕竟它们是原始的。对于 GRGB,拜耳模式如下所示:
文件中的内容是一个 1920x1280 的 12+4 位样本网格,排列顺序与像素的顺序相同,但每个样本只有一个通道,即与其在拜耳模式中的位置相对应的通道.
此外,色彩空间可能是线性的,而不是 Gamma 压缩的。除非您对其进行逆向工程,否则色彩平衡是未知的。一个合适的解码器会有一个校准的颜色矩阵,但我没有。
我把这两件事结合起来,猜了一个色彩平衡来做一个非常基本的解码(去马赛克不好,只是为了证明上面的信息可能是准确的):
使用此 C# 代码:
Bitmap bm = new Bitmap(1920, 1280);
for (int y = 0; y < 1280; y += 2)
{
int i = y * 1920 * 2;
for (int x = 0; x < 1920; x += 2)
{
const int stride = 1920 * 2;
int d0 = data[i] + (data[i + 1] << 8);
int d1 = data[i + 2] + (data[i + 3] << 8);
int d2 = data[i + stride] + (data[i + stride + 1] << 8);
int d3 = data[i + stride + 2] + (data[i + stride + 3] << 8);
i += 4;
int r = Math.Min((int)(Math.Sqrt(d1) * 4.5), 255);
int b = Math.Min((int)(Math.Sqrt(d2) * 9), 255);
int g0 = Math.Min((int)(Math.Sqrt(d0) * 5), 255);
int g3 = Math.Min((int)(Math.Sqrt(d3) * 5), 255);
int g1 = Math.Min((int)(Math.Sqrt((d0 + d3) * 0.5) * 5), 255);
bm.SetPixel(x, y, Color.FromArgb(r, g0, b));
bm.SetPixel(x + 1, y, Color.FromArgb(r, g1, b));
bm.SetPixel(x, y + 1, Color.FromArgb(r, g1, b));
bm.SetPixel(x + 1, y + 1, Color.FromArgb(r, g3, b));
}
}