以前の質問 (ここで質問) にもかかわらず、私たちのプロジェクトは glDrawPixels の使用に制限されているため、いくつかのハッカーを行う必要があります。
機能要件の 1 つは、画像のクリックされた領域に拡大ビューを表示できるようにすることです。画像を見て、マウスをクリックすると、マウスの位置に 200% の画像ウィンドウが表示されます。カーソルをドラッグすると、ウィンドウがカーソルに追従するはずです。
コンテキストは次のように設定されます。
Big Red Book には、次のようなコードがあります。
Gl.glShadeModel(Gl.GL_FLAT);
Gl.glClearColor(0.1f, 0.1f, 0.1f, 0.0f);
Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 2);
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_LINE);
Gl.glDisable(Gl.GL_SCISSOR_TEST);
Gl.glDisable(Gl.GL_ALPHA_TEST);
Gl.glDisable(Gl.GL_STENCIL_TEST);
Gl.glDisable(Gl.GL_DEPTH_TEST);
Gl.glDisable(Gl.GL_BLEND);
Gl.glDisable(Gl.GL_DITHER);
Gl.glDisable(Gl.GL_LOGIC_OP);
Gl.glDisable(Gl.GL_LIGHTING);
Gl.glDisable(Gl.GL_FOG);
Gl.glDisable(Gl.GL_TEXTURE_1D);
Gl.glDisable(Gl.GL_TEXTURE_2D);
Gl.glPixelTransferi(Gl.GL_MAP_COLOR, Gl.GL_TRUE);
Gl.glPixelTransferf(Gl.GL_RED_SCALE, 1.0f);
Gl.glPixelTransferi(Gl.GL_RED_BIAS, 0);
Gl.glPixelTransferf(Gl.GL_GREEN_SCALE, 1.0f);
Gl.glPixelTransferi(Gl.GL_GREEN_BIAS, 0);
Gl.glPixelTransferf(Gl.GL_BLUE_SCALE, 1.0f);
Gl.glPixelTransferi(Gl.GL_BLUE_BIAS, 0);
Gl.glPixelTransferi(Gl.GL_ALPHA_SCALE, 1);
Gl.glPixelTransferi(Gl.GL_ALPHA_BIAS, 0);
そして、小さいがズームされた画像を作成する呼び出しは次のようになります
int width = (int)((this.Width * 0.2)/2.0);
Gl.glReadBuffer(Gl.GL_FRONT_AND_BACK);
Gl.glRasterPos2i(0, 0);
Gl.glBitmap(0, 0, 0, 0, mStartX - (width*2), mStartY, null);
Gl.glPixelZoom(2.0f, 2.0f);
Gl.glCopyPixels(mStartX - width, mStartY, width, width, Gl.GL_COLOR);
ここで、mStartY と mStartX はクリックが発生したポイントです。
問題は、表示されるウィンドウが実際にルックアップ テーブルを壊し、画像を本質的に白黒のバイナリ イメージ (つまり、グレーの陰影がない) に圧縮していることです。
データは白黒の符号なし短い配列で、次のコードで設定されます。
float step = (65535.0f / (float)(max - min));
mColorTable = new ushort[65536];
int i;
for (i = 0; i < 65536; i++)
{
if (i < min)
mColorTable[i] = 0;
else if (i > max)
mColorTable[i] = 65535;
else
mColorTable[i] = (ushort)((float)(i - min) * step);
}
.... //some irrelevant code
Gl.glPixelMapusv(Gl.GL_PIXEL_MAP_R_TO_R, 65536, mColorTable);
Gl.glPixelMapusv(Gl.GL_PIXEL_MAP_G_TO_G, 65536, mColorTable);
Gl.glPixelMapusv(Gl.GL_PIXEL_MAP_B_TO_B, 65536, mColorTable);
さて、このドキュメントによると、GL_PIXEL_MAP_I_TO_I を使用して INDEX_SCALE と INDEX_BIAS をゼロに設定する必要がありますが、それを行っても結果は変わらず、画像が大幅にクランプされます。そして、「非常にクランプされた」とは、黒または白のいずれかで、グレーの色合いがほとんどないことを意味しますが、拡大されていない元の画像は期待どおりに見えます.
では、拡大ビューのクランプを回避するにはどうすればよいですか? カーソルに追従し、最初のコントロールからのデータが入力される 2 番目のコントロールを作成する必要がありますか? このアプローチでは、配列のコピーがグラフィックス カードの外に出て C# に取り込まれるように思われますが、これはほぼ定義上遅くなり、コントロールが応答しなくなります。
ああ、それが問題なら、私は C# と Tao フレームワークを使用しています。