在 GLJpanel 中绘制图像的正确方法
Proper way to draw images in GLJpanel
我在我的 Java swing 应用程序中使用 GLJpanel
组件,我想在我的 GLJPanel 中绘制来自 FFmpegFrameGrabber
的帧图像,为此我的想法是使用下面提到的组件图形。
import org.bytedeco.javacv.Frame;
import com.jogamp.opengl.awt.GLJPanel;
public void showImage(GLJPanel panel, Frame frame) {
Graphics2D graphics = (Graphics2D) panel.getGraphics();
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bfimage = converter.convert(frame);
graphics.drawImage(bfimage, null, 0,0);
}
这是在启用 GL 的组件中绘制图像的正确方法还是有其他方法,我怀疑我错了但我无法证明
我的 GLJPanel
创建如下
final GLProfile profile = GLProfile.get(GLProfile.GL2);
GLCapabilities capabilities = new GLCapabilities(profile);
GLJPanel panel = new GLJPanel(capabilities);
我所要做的就是创建一个GLEventListener
,这个接口有4个方法display
、displayChanged
、init
和dispose
然后负责绘图的公共参数GLAutoDrawable
在绘制图像的情况下 BufferedImage
我相信第一步是将任何图像输入转换为 BufferedImage
在我的情况下,我将此行为包含在实用程序 class 中并提供包含我转换后的图像的队列。
要绘制你必须使用 Texture
这个可以使用 TextureData
创建,它将使用缓冲图像如下
TextureData textureData = AWTTextureIO.newTextureData(gl.getGLProfile(), baseImage, false);
Texture texture = TextureIO.newTexture(textureData);
所以最后我的显示应该像
public synchronized void display(GLAutoDrawable drawable) {
BufferedImage baseImage = frames.poll();
if(baseImage == null)return;
final GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
// Create a TextureData and Texture from it
TextureData textureData = AWTTextureIO.newTextureData(gl.getGLProfile(), baseImage, false);
Texture texture = TextureIO.newTexture(textureData);
// Now draw one quad with the texture
texture.enable(gl);
texture.bind(gl);
gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_REPLACE);
TextureCoords coords = texture.getImageTexCoords();
gl.glBegin(GL2.GL_QUADS);
gl.glTexCoord2f(coords.left(), coords.bottom());
gl.glVertex3f(0, 0, 0);
gl.glTexCoord2f(coords.right(), coords.bottom());
gl.glVertex3f(1, 0, 0);
gl.glTexCoord2f(coords.right(), coords.top());
gl.glVertex3f(1, 1, 0);
gl.glTexCoord2f(coords.left(), coords.top());
gl.glVertex3f(0, 1, 0);
gl.glEnd();
texture.disable(gl);
texture.destroy(gl);
//baseImage = null;
}
我在我的 Java swing 应用程序中使用 GLJpanel
组件,我想在我的 GLJPanel 中绘制来自 FFmpegFrameGrabber
的帧图像,为此我的想法是使用下面提到的组件图形。
import org.bytedeco.javacv.Frame;
import com.jogamp.opengl.awt.GLJPanel;
public void showImage(GLJPanel panel, Frame frame) {
Graphics2D graphics = (Graphics2D) panel.getGraphics();
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bfimage = converter.convert(frame);
graphics.drawImage(bfimage, null, 0,0);
}
这是在启用 GL 的组件中绘制图像的正确方法还是有其他方法,我怀疑我错了但我无法证明
我的 GLJPanel
创建如下
final GLProfile profile = GLProfile.get(GLProfile.GL2);
GLCapabilities capabilities = new GLCapabilities(profile);
GLJPanel panel = new GLJPanel(capabilities);
我所要做的就是创建一个GLEventListener
,这个接口有4个方法display
、displayChanged
、init
和dispose
然后负责绘图的公共参数GLAutoDrawable
在绘制图像的情况下 BufferedImage
我相信第一步是将任何图像输入转换为 BufferedImage
在我的情况下,我将此行为包含在实用程序 class 中并提供包含我转换后的图像的队列。
要绘制你必须使用 Texture
这个可以使用 TextureData
创建,它将使用缓冲图像如下
TextureData textureData = AWTTextureIO.newTextureData(gl.getGLProfile(), baseImage, false);
Texture texture = TextureIO.newTexture(textureData);
所以最后我的显示应该像
public synchronized void display(GLAutoDrawable drawable) {
BufferedImage baseImage = frames.poll();
if(baseImage == null)return;
final GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
// Create a TextureData and Texture from it
TextureData textureData = AWTTextureIO.newTextureData(gl.getGLProfile(), baseImage, false);
Texture texture = TextureIO.newTexture(textureData);
// Now draw one quad with the texture
texture.enable(gl);
texture.bind(gl);
gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_REPLACE);
TextureCoords coords = texture.getImageTexCoords();
gl.glBegin(GL2.GL_QUADS);
gl.glTexCoord2f(coords.left(), coords.bottom());
gl.glVertex3f(0, 0, 0);
gl.glTexCoord2f(coords.right(), coords.bottom());
gl.glVertex3f(1, 0, 0);
gl.glTexCoord2f(coords.right(), coords.top());
gl.glVertex3f(1, 1, 0);
gl.glTexCoord2f(coords.left(), coords.top());
gl.glVertex3f(0, 1, 0);
gl.glEnd();
texture.disable(gl);
texture.destroy(gl);
//baseImage = null;
}