我想写一个在 BGR 中转换 BGRA 的函数。
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 一切都是正确的,但之后迭代器和指针的解决方案是不同的。
谢谢。