gpt4 book ai didi

c - 如何对像素数据进行位 strip 化?

转载 作者:太空狗 更新时间:2023-10-29 17:06:36 29 4
gpt4 key购买 nike

我有 3 个缓冲区,其中包含在 32 位处理器上运行的 R、G、B 位数据。

我需要按以下方式组合三个字节:

R[0] = 0b r1r2r3r4r5r6r7r8
G[0] = 0b g1g2g3g4g5g6g7g8
B[0] = 0b b1b2b3b4b5b6b7b8

int32_t Out = 0b r1g1b1r2g2b2r3g3 b3r4g4b4r5g5b5r6 g6b6r7g7b7r8g8b8 xxxxxxxx

其中 xxxxxxxx 继续处理缓冲区中的每个下一个字节。

我正在寻找一种组合它们的最佳方式。我的方法肯定效率不高。

这是我的方法

static void rgbcombineline(uint8_t line)
{
uint32_t i, bit;
uint8_t bitMask, rByte, gByte, bByte;
uint32_t ByteExp, rgbByte;
uint8_t *strPtr = (uint8_t*)&ByteExp;

for (i = 0; i < (LCDpixelsCol / 8); i++)
{
rByte = rDispbuff[line][i];
gByte = gDispbuff[line][i];
bByte = bDispbuff[line][i];

bitMask = 0b00000001;
ByteExp = 0;
for(bit = 0; bit < 8; bit++)
{
rgbByte = 0;
rgbByte |= ((rByte & bitMask) >> bit) << 2;
rgbByte |= ((gByte & bitMask) >> bit) << 1;
rgbByte |= ((bByte & bitMask) >> bit);
ByteExp |= (rgbByte << 3*bit);
bitMask <<= 1;
}
TempLinebuff[((i*3)+0) +2] = *(strPtr + 2);
TempLinebuff[((i*3)+1) +2] = *(strPtr + 1);
TempLinebuff[((i*3)+2) +2] = *(strPtr + 0);
}
}

最佳答案

如果您可以腾出 1024 个字节,则可以使用一个 256 元素的查找表来实现您想要的结果:

uint32_t lookup[256] = {
0, 1, 8, 9, 64, 65, ...
/* map abcdefgh to a00b00c00d00e00f00g00h */
};

uint32_t result = (lookup[rByte] << 2) | (lookup[gByte] << 1) | lookup[bByte];

这仅使用 3 次查找、2 次移位和 2 次 or 操作,这应该提供可接受的加速。

如果你有更多的空间,你也可以使用三个查找表来消除移位(尽管这可能会导致缓存性能变差,所以请始终进行配置文件检查!)

关于c - 如何对像素数据进行位 strip 化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36256537/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com