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になるまではすべて正しいですが、後からイテレーターとポインターを使用したソリューションは異なります。
ありがとう。