gpt4 book ai didi

在 C 中将 RGB 转换为 RGBA

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:27 25 4
gpt4 key购买 nike

我需要将表示 RGB 字节顺序图像的字节数组的内容复制到另一个 RGBA(每像素 4 个字节)缓冲区中。 Alpha channel 将在稍后填充。实现这一目标的最快方法是什么?

最佳答案

你想要它有多棘手?您可以将其设置为一次复制一个 4 字节的字,这在某些 32 位系统上可能会更快一些:

void fast_unpack(char* rgba, const char* rgb, const int count) {
if(count==0)
return;
for(int i=count; --i; rgba+=4, rgb+=3) {
*(uint32_t*)(void*)rgba = *(const uint32_t*)(const void*)rgb;
}
for(int j=0; j<3; ++j) {
rgba[j] = rgb[j];
}
}

最后的额外情况是处理 rgb 数组缺少一个字节的事实。您还可以使用对齐移动和 SSE 指令使其更快一些,一次以 4 像素的倍数工作。如果您真的雄心勃勃,您可以尝试更可怕的混淆方法,例如将高速缓存行预取到 FP 寄存器中,然后立即将其 blit 到另一个图像。当然,您从这些优化中获得的 yield 将在很大程度上取决于您所针对的特定系统配置,而且我真的很怀疑做任何这些而不是简单的事情是否有很多好处。

我的简单实验证实这确实是 little 一点点快,至少在我的 x86 机器上是这样。这是一个基准:

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <time.h>

void fast_unpack(char* rgba, const char* rgb, const int count) {
if(count==0)
return;
for(int i=count; --i; rgba+=4, rgb+=3) {
*(uint32_t*)(void*)rgba = *(const uint32_t*)(const void*)rgb;
}
for(int j=0; j<3; ++j) {
rgba[j] = rgb[j];
}
}

void simple_unpack(char* rgba, const char* rgb, const int count) {
for(int i=0; i<count; ++i) {
for(int j=0; j<3; ++j) {
rgba[j] = rgb[j];
}
rgba += 4;
rgb += 3;
}
}

int main() {
const int count = 512*512;
const int N = 10000;

char* src = (char*)malloc(count * 3);
char* dst = (char*)malloc(count * 4);

clock_t c0, c1;
double t;
printf("Image size = %d bytes\n", count);
printf("Number of iterations = %d\n", N);

printf("Testing simple unpack....");
c0 = clock();
for(int i=0; i<N; ++i) {
simple_unpack(dst, src, count);
}
c1 = clock();
printf("Done\n");
t = (double)(c1 - c0) / (double)CLOCKS_PER_SEC;
printf("Elapsed time: %lf\nAverage time: %lf\n", t, t/N);


printf("Testing tricky unpack....");
c0 = clock();
for(int i=0; i<N; ++i) {
fast_unpack(dst, src, count);
}
c1 = clock();
printf("Done\n");
t = (double)(c1 - c0) / (double)CLOCKS_PER_SEC;
printf("Elapsed time: %lf\nAverage time: %lf\n", t, t/N);

return 0;
}

结果如下(使用 g++ -O3 编译):

Image size = 262144 bytes

Number of iterations = 10000

Testing simple unpack....Done

Elapsed time: 3.830000

Average time: 0.000383

Testing tricky unpack....Done

Elapsed time: 2.390000

Average time: 0.000239

所以,如果天气好的时候可能会快 40% 左右。

关于在 C 中将 RGB 转换为 RGBA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33697150/

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