Я хочу написать функцию для преобразования 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 раза быстрее, чем решение с итератором.
UPDATE:
Я проверил с помощью отладчика:
src имеет ширину 480x360 и до i == 259 все верно, но после слов решение с итератором и указателем отличается.
Спасибо.