BGRにBGRAを変換する関数を書いてみたい。 void convertBGRAViewtoBGRView(const boost::gil::bgra8_view_t &src, boost::gil::bgr8_view_t dst)
私はこのようにそれを記述する場合:boost :: gil bgr8_view_tオブジェクトへのポインタ
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が幅480×360を持って、私==まで259すべてが正しいですが、イテレータやポインタで解決あとがき異なっています。
ありがとうございました。
これは本当に良い点です。さて、イテレータでこれを試してみましたが、これはこのソリューションよりもはるかに低速でした。その考え方は、NEON命令を使用して速度を上げることです。イテレータでなぜそれがずっと遅いのか分かりますか?違いは約30倍でした! – steffenmauch
@ user1150937あなたが聞いているのは、イテレータインターフェイスから抜け出すのが良い理由です。しかし、あなたは本当にあなたが何をしているのか、それについてGILが何を考えているのかを知るべきです。 –
これが64byteに揃えられていることが分かりますか? 'bgra8_view_t sourceView = interleaved_view(srcWidth、srcHeight、(bgra8_pixel_t *)dataPtr、stride); copy_with_regards_to_orientation(sourceView、view(result)、orientation); ' – steffenmauch