gpt4 book ai didi

c++ - boost::gil 指向 bgr8_view_t 对象的指针

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

我想编写一个将 BGRA 转换为 BGR 的函数。void convertBGRAViewtoBGRView(const boost::gil::bgra8_view_t &src, boost::gil::bgr8_view_t dst)如果我这样写:

size_t numPixels = src.width() * src.height();
boost::gil::bgra8_view_t::iterator it = src.begin();
boost::gil::bgr8_view_t::iterator itD = dst.begin();
for( int i = 0; i < numPixels; ++i ){

boost::gil::bgra8_pixel_t pixe(it[0]);
*it++;
boost::gil::bgr8_pixel_t pix(pixe[0],pixe[1],pixe[2]);

*itD++ = pix;
}

可以用,但是速度很慢。所以我想使用 NEON 指令,因此我需要一个指针,例如 (UInt8*) 或 (UInt32*)。我这样试过:

UInt32 *temp = (UInt32*)&src(0,0);
for( int i = 0; i < numPixels; ++i ){
boost::gil::bgr8_pixel_t pixk( (( *temp) & 0xff), ( (*temp>>8) & 0xff), ((*temp >> 16 )& 0xff));
*itD++ = pixk;
temp += 1;
}

这或多或少有效,但生成的图像不正确。我认为对齐可能有问题。有谁知道如何让它工作?该解决方案比使用迭代器的解决方案快大约 3 倍。

更新:我检查了调试器:src 的宽度为 480x360,直到 i == 259 一切都是正确的,但之后迭代器和指针的解决方案是不同的。

谢谢。

最佳答案

根据您的回答进行一些计算后,我发现 360*4 可以被 32 整除,而 360*4+8*4 是偶数可以被 64 整除。所以我猜错误的原因是你的 GIL 试图在 64 字节边界对齐图像行,因此不会连续存储它们。

因此,始终建议使用通用迭代器接口(interface)而不是直接弄乱原始内存,否则你必须完全确定任何此类对齐约定(但也许它们是完全标准化的并且可以在某处阅读文档)。

关于c++ - boost::gil 指向 bgr8_view_t 对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9140662/

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