当前位置: 首页 > 知识库问答 >
问题:

BuffereImage不显示(全黑),但可以显示图像

刁钧
2023-03-14

我不熟悉Java图形(一般来说是计算机图形)和堆栈溢出,所以请帮助我解决问题,帮助我更好地表达我的问题。

目前,我正在尝试在JavaGUI中的原始图像旁边显示BufferedImage。这是我的代码:

Image oriImage = robot.getQwerkController().getVideoStreamService().getFrame(); //load the original image
Graphics2D hi = bufferedImage.createGraphics();
hi.drawImage(oriImage, 0,0, null); //draw the original image into the BufferedImage
hi.dispose();
images[0].put(oriImage, 1); //draws the original image in the first frame
images[1].put(bufferedImage, 2); //draws the BufferedImage in the second frame

“put”功能如下:

public synchronized void put(Image image, int frameNumber) {
    icon.setImage(image); //sets the image displayed by this icon
    display.paintImageIcon(icon, frameNumber); //paint the image onto the gui
    imageSet = true;
    notifyAll();
}

但是,生成的GUI如下所示

因此,图像可以工作,但BuffereImage不能。我假设它可以工作,因为BuffereImage是Image的一个子类……知道吗?如果需要其他代码,请告诉我~提前感谢:)

编辑1:

我做了一些测试,我没有使用原始图像,而是创建了一个全新的BuffereImage,并使用Graphics2D绘制一条线,然后尝试显示它。结果如下:

http://i.imgur.com/rJAdp.jpg

所以它起作用了。所以一定是原图出了问题(或者发生的转换)

编辑2:我用bufferedImage做了类似的事情并画了一条线。结果与EDIT 1相同,因此我认为draImage函数存在一些问题。

编辑3:我修复了这个问题,在drawImage周围放置了一个while循环,让它完成图像绘制(因为如果它还没有完成绘制图像,则返回false),并且成功了!:D

boolean x = false;
while (!x) {
    x = hi.drawImage(oriImage, 0,0, null); //draw the original image into the BufferedImage
}

共有2个答案

潘佐
2023-03-14

抱歉,但我猜您正在使用即时绘制(推送)。一般来说,java是以另一种方式(拉)实现的。

Java swing/awt绘制事件驱动的:人们不会立即绘制图像,但可以通过无效或重新绘制来触发它。您可以使用帧速率启动swing计时器,并在那里调用repaint()。

一般来说,JPanel子对象可能会覆盖绘画组件(图形g)并在g上绘制。

然而,这很奇怪。您可以尝试记录oriImage。getHeight(null),以查看(不太可能)是否异步生成图像(开始时高度为1)。

易飞文
2023-03-14

如果您只需将ImageObserver(您正在绘制的JFrame或JPanel实例)传递到drawImage方法中,而不是将其传递到null方法中,则应该能够获得相同的结果。然后,这将为您处理异步图像加载。

 类似资料:
  • 我在试着编一个纸牌游戏。我有一个像雪碧片一样的系统来获得个人卡。这是我的Deck类的代码(没有一些函数): 当我在自己的JPanel类上绘制单个ImageIcons或大BuffereImage时,所有内容都是黑色的。当我尝试将TYPE\u INT\u RGB更改为ARGB时,图像会变得完全透明且没有大小。jpg版本的图像也会出现这种情况。我尝试了g.drawImage(…,frame);g、 dr

  • 不太确定问题发生在哪里。我在Blender有一个模型看起来是这样的: 我有它所有的UV贴图和这样的 ,蓝色高亮的边缘是从一个透明的.png纹理。下面是节点编辑器: 现在,当我按照LibGDX建议导出到.fbx时,我使用以下设置: 但当我通过fbx-convert运行它并生成我的g3dj文件时,材料显示如下: 没有图像纹理在视线内(即使当不透明度更改为1.0)。是不是有什么其他的东西我应该做,将使它

  • 黑客有没有办法抓住这个按钮并“点击”它? 是否需要添加另一层安全性?

  • 我已经制作了Hello World RCP应用程序,得到了以下类结构: 向Perspective.createInitialLayout()添加额外代码: 但不显示视图。 我将breakpoint设置到perspective.createInitialLayout()中,发现它没有执行。 我的观点声明是: ApplicationWorkbenchAdvisor.GetInitialWindowPe

  • 我尝试了一切,但图像不会显示,我试图缩小图像,但没有用,我试图改变路径,我试图更改图像的位置,但没有帮助,我试图在互联网上搜索,但什么都没有。 我看到的只是空白的图形用户界面,没有文本和图像。如果你能帮我,你会帮我一个大忙。 代码如下:

  • 我正在使用此代码显示图像 图片存在于storage\app\public\images上,但它没有显示在我的页面上,顺便说一句,我已经创建了php artisan storage:link