0

グレースケール ピクセル値 (1 の分数として浮動小数点数) の配列があり、表示して保存する必要があります。値は計算から得られたものなので、現在インストールされているライブラリなどはありません。私は CImage ライブラリを理解しようとしていますが、このデータを視覚化するために何をする必要があるのか​​ あまり理解できません。どんな助けでも大歓迎です!

ありがとうございました。

4

3 に答える 3

2

私が使用してある程度成功したアプローチの 1 つは、D3DX のテクスチャ関数を使用して Direct3D テクスチャを作成し、塗りつぶすことです。D3D の起動には多少のオーバーヘッドがありますが、マルチスレッド対応のテクスチャ作成とビルトイン風の表示が提供され、ファイルへの保存もそれほど手間がかかりません。

D3D(X) の使用に興味がない場合、ここでの詳細の一部は役に立たないでしょうが、ジェネレーターは、他のライブラリのデータを出力する方法を理解するのに役立つはずです。

たとえば、既存の D3D9 デバイスpDeviceとノイズ ジェネレーター (または他のテクスチャ データ ソース) があるとしpGenます。

IDirect3DTexture9 * pTexture = nullptr;
D3DXCreateTexture(pDevice, 255, 255, 0, 0, D3DFMT_R8G8B8, D3DPOOL_DEFAULT, &pTexture);
D3DXFillTexture(pTexture, &texFill, pGen);
D3DXSaveTexture("texture.png", D3DXIFF_PNG, pTexture, NULL);

ジェネレーター関数:

VOID WINAPI texFill(
    D3DXVECTOR4* pOut, 
    CONST D3DXVECTOR2* pTexCoord, 
    CONST D3DXVECTOR2* pTexelSize, 
    LPVOID pData,  
) {
    // For a prefilled array:
    float * pArray = (float *)pData;
    float initial = pArray[(pTexCoord->y*255)+pTexCoord->x];

    // For a generator object:
    Generator * pGen = (Generator*)pData; // passed in as the third param to fill
    float initial = pGen->GetPixel(pTexCoord->x, pTexCoord->y);

    pOut->x = pOut->y = pOut->z = (initial * 255);
    pOut->w = 255; // set alpha to opaque
}

対応する関数は、ボリューム/3D テクスチャで使用できます。これらは D3D 用に既にセットアップされているため、テクスチャを単純にフラットなクワッドにレンダリングして表示したり、任意のグラフィカル アプリケーションでソースとして使用したりできます。

ジェネレータがスレッド セーフである限り、作成/塗りつぶし/保存をテクスチャごとに 1 つのスレッドで実行し、複数のスライスまたはフレームを同時に生成できます。

于 2012-08-15T19:07:04.367 に答える
0

この問題の最善の解決策は、SFML ライブラリ (www.sfml-dev.org) を使用することであることがわかりました。使い方は非常に簡単ですが、VS2010 で使用する場合はソースからコンパイルする必要があります。

于 2012-08-16T20:48:32.780 に答える
0

ライブラリがなくてもPNM イメージ形式を使用できます。(フォーマット自体は自明です)。ただし、これはかなり古風であり、それをサポートする画像ビューアが必要です。たとえば、IvanView は Windows でサポートしています。

于 2012-08-16T20:53:25.663 に答える