-2

前の質問12から、次のコードがあります。

画面をキャプチャする方法:

int width = glutGet(GLUT_WINDOW_WIDTH);
int height = glutGet(GLUT_WINDOW_HEIGHT);

std::vector< unsigned char > rgbdata(4*width*height);
glReadPixels(0, 0, width, height,GL_RGBA,GL_UNSIGNED_BYTE, &rgbdata[0]);

int save_result = SOIL_save_image
    (
        filename,
        SOIL_SAVE_TYPE_PNG,
        width, height, 4,
        rgbdata.data()
    );

PNGに保存する方法:

#define png_infopp_NULL (png_infopp)NULL
#define int_p_NULL (int*)NULL
#include <boost/gil/gil_all.hpp>
#include <boost/gil/extension/io/png_dynamic_io.hpp>
using namespace boost::gil;
int main()
{
    rgb8_image_t img(512, 512);
    rgb8_pixel_t red(255, 0, 0);
    fill_pixels(view(img), red);
    png_write_view("redsquare.png", const_view(img));
}

pngキャプチャした画面をファイルに保存したい。さて、問題は、これらのコードを互いにカスケードする方法です。これらの配列は相互に変換可能ですか?

4

1 に答える 1

-2

知るか?C の malloc で割り当てられた生のポインターとしてイメージを渡すのが最善です。これは主に、人々が本質的に同じデータ型のエイリアスを作成し、テンプレートが混乱するためです。

内部フォーマットとして rgb または rgba を選択します。次に、グルー コードを記述して、サードパーティのライブラリ パーティが必要とする形式に変換します。この場合、Boost は、Boost 自体が作成する rgb8_image_t を取得しています。画像を保存するために bool gil に依存する正確なポイントを除いて、そのシンボルが名前空間を汚染することは望ましくありません。したがって、ラッパーを作成してから、フォーマットが正しくなるまで Boost をいじってください。

Baby X のファイル保存ルーチンを使用すると、これらの問題は解消されます。ルーチンは unsigned char バッファーを使用し、画像のデータ型をエクスポートしようとしません。

https://github.com/MalcolmMcLean/babyxrc

(lodePNG は私のものではありません。Lode Vandevenne が作成したものです。ライセンス要件に従ってください。他の形式は私が作成したものなので、好きなようにできます)。

于 2016-12-23T21:27:19.350 に答える