2016-12-20 25 views
0

glReadPixelsを使用して、ピクセルを配列に読み込んでいます。しかし、このイメージのサイズは少し大きいので、私はそれを特定のサイズにリサイズします。画像のサイズを変更するOpenGL関数が見つかりません。この種の関数が存在するのでしょうか、画像のサイズを変更する独自の関数を書く必要がありますか?glReadPixelsから返されたサイズ変更イメージ

注:OSはUbuntu 14.04です。

これは画像を読み取るコードです。

int img_w = 640; // screen size 
int img_h = 480; 
uint8_t img[img_w*img_h*3]; 
glReadPixels(0, 0, img_w, img_h, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)img); 

// NEW image size 
int new_w = 140; 
int new_h = 140; 
uint8_t new_img[new_w*new_h*3]; 
// Is there some opengl function to resize the image in `img` like: 
gl_some_resize_func(img, new_w, new_h, new_img); 
+1

「glReadPixels」を使用することは、OpenGLでできる最も遅いものの1つであり、GPUから可能な限り同期してメモリを転送しないようにすべきだと聞いたことでしょう。サイズ変更に関しては、フルスクリーンクワッドを使用してより小さなフレームバッファにイメージをレンダリングした後、少量のピクセルをダウンロードする方が速いでしょう。 – PeterT

+0

@PeterT私は本当に 'glReadPixles'の代替案を知らない。サイズを変更するには、新しい小さなフレームバッファを作成し、その上に原点 'img'をこのフレームバッファに直接投げることができます(OpenGLは自動的に"サイズ変更 "されますか?)、次に遅い' glReadPixels 'フレームバッファから読み込みますか? –

+0

このチュートリアルで 'glReadPixels'(または' glBegin/glEnd'など)を使用する方法を教えてくれれば、OpenGL 3+用の最新版を見つけてください。あなたは長年にわたって廃止されていたレガシー機能を使用しています.OpenGLの学習を始めたばかりなので、正しい方法を学ぶことをお勧めします。 – ybungalobill

答えて

-2

いいえ、ありません。これは、画像処理ライブラリや独自の関数の関数となります。フリーイメージ、openjpeg。 OpenGLは、表示するジオメトリの出力を行い、ラスタイメージの操作は行いません。

それはあなたが常に専用のライブラリーに比べて品質の損失を持つことになりますため、最悪の品質で再びそれを読んで、それを実際に助言していないように、スケールおよびフィルタリングを使用して、それをリサンプリングし、テクスチャとして画像をレンダリングするために_可能です。この場合のモバイルプラットフォームでは、16ビット形式で現在サポートされているテクスチャがあるため、コンポーネントの損失にもなります。それができる唯一のケースは、CPUをオフロードしたり、テクスチャにレンダリングする必要がある場合です。これは実際に別の方法で行われました。

この場合も、FreeImage、OpenJpeg、SDL、またはQtを使用すると、タスクにとってはるかに優れた手段が提供されます。

+1

OpenGLはラスタライザAPIであり、少なくとも半分はラスタイメージ、a.k.aテクスチャ、イメージ、フレームバッファで動作します。画像のサイズを変更すると、小さな画像のピクセル上でルーピングされ、正しいフィルタリングで正しい位置で大きな画像をサンプリングします。そして、この**は** OpenGLがサポートしているもので、実際には非常に優れています。 – ybungalobill

+0

ybungalobillが何を参照しているのか疑問に思った場合:テクスチャ付きクワッドを描く。 *ただし、(実際に言わなければならないが)デフォルトの縮小と拡大フィルタは曖昧に指定されているため、実装には余裕があり、結果として得られる画質は大きく異なる可能性があります。非常に正確で再現性のある高品質のフィルタリング結果が必要な場合は、専用の画像処理ライブラリ(OpenGLでGPUアクセラレーションおよび/または統合されている可能性があります)に固執する方法が適しています。独自のフィルタを実装することもできます(OpenCLまたは計算シェーダを使用)。 – datenwolf

+0

@datenwolf:フィルタリングを行うglBlitNamedFramebufferがあるだけでなく、framebufferをまったく設定しなくても、 'imageLoad/Stores'を使って計算シェーダを実行することもできます。デフォルトの縮小フィルタは 'GL_NEAREST_MIPMAP_LINEAR'で、デフォルトの拡大率は' GL_LINEAR'です。あなたが使うかもしれないし、使わないかもしれない 'glGenerateTextureMipmap'を除いて、両方がどのように計算されるかが正確に指定されています。 – ybungalobill

関連する問題