gpt4 book ai didi

java - 在GLJpanel中绘制图像的正确方法

转载 作者:行者123 更新时间:2023-12-02 09:10:19 24 4
gpt4 key购买 nike

我在我的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,这个接口(interface)有4个方法displaydisplayChangedinitdispose 然后是负责绘图的公共(public)参数 GLAutoDrawable

在绘制图像的情况下 BufferedImage 我相信第一步是将任何图像输入转换为 BufferedImage 在我的例子中,我将此行为封装在一个实用程序类中并提供包含我转换后的图像的队列。

要绘制,您必须使用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 - 在GLJpanel中绘制图像的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59478688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com