ゴール
私はBoost GILに移行して、私が実装した同様の機能を置き換えようとしていますが、これは保守可能な寿命の終わりに近づいています。
を使用して 24 BPP、8 ビット RGB 画像で動作する既存のコードがありますuint8_t*
。同じインターフェイスを使用してさまざまな場所 (OpenGL バッファーなど) から画像を公開しているため、これを変更することはできません。また、既にかなり多くのコードが存在します。
したがって、ファイルを読み取り、ストレージの管理に使用できる にピクセルをバイト単位でコピーすることから始めて、GIL を小さなステップで使用しようとしていますstd::vector<uint8_t>
が、それでも をuint8_t*
使用して を取得し&vector[0]
ます。
これは、リファクタリングが理にかなっているポイントになるまで、既存のインターフェイスの背後に透過的にドロップできます。
私が試したこと
copy_pixels()
これは、適切に構築された 2 つのビューを使用する単純なケースであると考えました。
ドキュメントを調べて試してみることで達成できたことの合計を示す、最小限の完全な例をまとめました。
#include <boost/gil/rgb.hpp>
#include <boost/gil/extension/io/png_dynamic_io.hpp>
#include <stdint.h>
#include <vector>
int main() {
std::vector<uint8_t> storage;
{
using namespace boost::gil;
rgb8_image_t img;
png_read_image("test.png", img);
// what should replace 3 here to be more "generic"?
storage.resize(img.width()*img.height()*3);
// doesn't work, the type of the images aren't compatible.
copy_pixels(const_view(img),
interleaved_view(img.width(), img.height(), &storage[0], 3*img.width()));
}
}
私が立ち往生している場所
これはコンパイルされません:
error: cannot convert ‘const boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector3<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t> > >’ to ‘unsigned char’ in assignment
これは一目瞭然です。RGB ピクセルは、unsigned char
自動的に単一のピクセルに変換することはできません。を使用してこれを修正しようと思いましたが、これらの変換でcopy_and_convert_pixels()
3:1 (つまり、ソース イメージの各ピクセルの出力に 3 つの s がある) の問題を回避する方法がわかりません。unsigned char
変換は、色空間の変換 (例: RGB->HSV) またはパッキングの変更を目的としているようです。