- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个Java7应用程序,它创建一个BufferedImage
,每当用户更改对图像有影响的内容时,后台线程就会使用它。问题是,当显示图像时,正确的图像仅显示几秒钟,然后显示不稳定的图像(大小正确)以及来自系统的帧缓冲区的其余部分;见下图:
它应该是这样的:
一旦绘制线程完成,BufferedImage
将在使用 AffineTransformation
进行转换后绘制到 JPanel
组件上以反射(reflect)一定的缩放级别。
BufferedImage 的大小由固定数字决定,该数字不依赖于 MacBook 或 JFrame 的分辨率(通常相当高,例如 4000x2000) 。绘制 BufferedImage 的面板位于可根据面板大小进行调整的 ScrollPane 内。每次线程绘制新版本时,BufferedImage
是否被重写或创建新的并不重要。
我已经在 Windows、一台不带视网膜显示屏的 MacBook 和三台带视网膜显示屏的 MacBook 上测试了该工具,在所有不带视网膜显示屏的机器上,该工具都能完美运行。有什么想法吗?
编辑:程序是这样工作的:HexaVisExplorer
类是使用项目的 NetBeans 构建的 JFrame
GUI。它保留一个 ScrollPane
和一个作为 ScrollPane
内容的 VisualizationPanel
,并且每当用户更改影响结果的属性时,图像,组件的 ActionListener
调用 VisualizationPanel
中的方法。在那里,设置了一个属性,并初始化并启动了一个 Thread
,该线程将根据 VisualizationPanel
中设置的属性绘制一个新的 BufferedImage
。完成此操作后,新的 BufferedImage 将被保存到 VisualizationPanel,然后将使用重写的 PaintComponent() 重新绘制,其中图像将使用 java.awt.geom.AffineTransform
进行转换,以实现高效缩放。最后,滚动 Pane 的视口(viewport)被修改以反射(reflect)新的图像大小。这是代码:
类 HexavisExplorer.java
public class HexaVisExplorer extends javax.swing.JFrame {
private VisualizationPanel visualizationPanel;
private javax.swing.JScrollPane jScrollPane1;
public HexaVisExplorer() {
//...Example where a component listener calls a method in VisualizationPanel.java to set a property
polygonBorderCheckbox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
visualizationPanel.setPolygonBorders(polygonBorderCheckbox.isSelected());
}
});
//...
}
}
类VisualizationPanel
,方法recalculate()
创建一个新的VisualizationThread
,它使用以下方法生成有问题的BufferedImage
VisualizationPanel 中的属性。当重新计算完成后,
public class VisualizationPanel extends JPanel {
private boolean polygonBorders;
//here be more property class variables and getter/setter for them
public void setPolygonBorders(boolean polygonBorders) {
this.polygonBorders = polygonBorders;
recalculate();
this.revalidate();
this.repaint();
}
public void recalculate(){
vt = new VisualizationThread(this);
vt.execute();
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
dataTransformation.setToScale(transform_factor, transform_factor);
g2d.transform(dataTransformation);
g2d.drawImage(toDraw, 0, 0, null);
this.setSize((int) Math.ceil(transform_factor * maxwidth), (int) Math.ceil(transform_factor * maxheight));
this.setPreferredSize(new Dimension((int) Math.ceil(transform_factor * maxwidth), (int) Math.ceil(transform_factor * maxheight)));
this.revalidate();
hx.modifyVisPanelViewport(this);
}
}
VisualizationThread
采用一个 VisualizationPanel
,读取其属性并基于该属性计算一个新的 BufferedImage。完成后,调用
done(),然后将新的
BufferedImage 设置为绘制到
VisualizationPanel` 并重新绘制它。
public class VisualizationThread extends SwingWorker<Object, Object> {
private VisualizationPanel vp;
private BufferedImage toDraw;
@Override
protected Object doInBackground() throws Exception {
// The bufferedImage gets drawn on here.
}
@Override
protected void done() {
vp.setToDraw(toDraw);
vp.setPreferredSize(new Dimension(toDraw.getWidth(), toDraw.getHeight()));
vp.repaint();
vp.revalidate();
}
}
最佳答案
它看起来就像主机对等组件期望使用一种颜色模型渲染图像,但遇到另一种颜色模型。有太多的方法会导致这个问题无法得到明确的答案,但有几件事需要仔细审查:
验证您的 BufferedImage
是否具有兼容的颜色模型和空间,例如 example .
考虑使用 AffineTransformOp
进行缩放,概述 here ,因为它可以创建“具有正确大小和波段数的目标图像。”
当 done()
在 event dispatch thread 上执行时,验证程序的其余部分是否正确同步,对于 example .
关于java - 在配备 Retina 显示屏的 MacBook 上显示 Java BufferedImage 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18700080/
我正在尝试初始化 STM32F10B 主板上的 DT028ATFT-TS 显示屏。该系统之前可与 DT028TFT-TS 配合使用,但该显示器已停产。由于使用了新的显示器,接口(interface)也
使用一点计算机视觉,我想在有人走到设备前(距离 2 英尺)时打开壁挂式 Android 设备的显示屏。 我是一名经验丰富的开发人员,但我对计算机视觉几乎一无所知。以编程方式打开显示器非常简单。任何指导
我正在使用phoneGap为iPhone创建一个应用程序,但我确信它无法使用视网膜显示屏工作,而是使用旧的iPhone3分辨率。 使用phoneGap开发时有没有办法让iPhone有2个版本?这是一个
我正在使用 Cocoa Touch 开发 iPhone 应用程序。 我将货币金额以及 ISO 4217 货币代码列表中的相关货币代码存储在表中: 例如:123.45 英镑、456.45 美元、321.
有没有办法以编程方式将 Apple Watch 显示屏旋转 180 度?这将使佩戴 Apple Watch 的人能够调整 Apple Watch 显示屏的方向,以便站在佩戴 watch 的人对面的人更
开始游戏后,游戏不会使用整个 Android 屏幕。这种情况仅发生在游戏本身中,如图像所示,因为用户无法到达屏幕底部。已尝试找到解决方案,但我尝试过的所有尝试似乎都不起作用。不确定要提供哪个代码,因此
我正在使用 SDL2,现在在 iOS 和 iPhone 5S 上使用它时遇到一点问题。当我创建一个窗口时,SDL 将创建一个分辨率为 320x568 像素的窗口。如果我通过创建窗口使用 SDL_WIN
只是这个问题,我想在我的 MonoTouch 应用程序中检测视网膜显示。谢谢。 最佳答案 已经有 answers对于 ObjectiveC 但这是 C# 版本: bool retina = (UIS
我有一个 Quartz 2D 游戏,它直接绘制到上下文上。因此,我必须调整代码,以便它可以在适合视网膜显示屏的情况下进行缩放。我使用以下代码执行此操作: - (CGFloat) displayScal
所以我认为我很接近,但我碰壁了。这是我想要完成的:我有一个计算点击次数的程序,并且会在值更新时将串行数据发送到 Arduino (UNO)。 到目前为止,我有以下工作:- LED 显示屏上的滚动字幕(
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
如何以编程方式 (Objective-C) 确定 iPad 是否具有 Retina 显示屏? 最佳答案 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceI
我正在开发一个具有大量 Assets 的应用程序。由于该应用程序同时具有 Retina 显示屏和正常分辨率的资源,因此我认为在开发结束时它将接近 2 GB。 是否可以发布一个支持 Retina 显示屏
我在互联网上哪里可以找到代码的 UI 元素来实现类似于 XCode 4 和 iTunes 中的 LCD 显示器。 XCode 4 中的比 iTunes 更先进一点,它提供了更多功能。 这是标准元素,还
2015 年 8 月 26 日编辑 好吧,这个问题可能有点粗糙,因为这个元素仍处于开发阶段,所以在法律上我还不能分享它来实时显示我的问题。 我遇到的问题是,我正在为客户构建站点,当我们开始测试阶段时,
我想单独在“Macbook Pro with Touchbar”上显示一些内容,并在其他台式机/笔记本电脑上隐藏相同的内容。 我知道使用媒体查询可以让我定位设备和像素比,但这里我试图定位支持触摸的笔记
我发现了一个 Swing 图像渲染错误,它只影响配备 Retina 显示屏的 Mac(TYPE_INT_ARGB_PRE BufferedImages 无法绘制)。我有一个有效的解决方法(改为使用 T
我已阅读Apple的“新闻和公告”如下: Using Identifiers in Your Apps March 21, 2013 Starting May 1, the App Store wil
iPhone4 和旧 iPhone 的图形开发在几个方面发生了变化: 介绍了点的概念替换像素。 UIImage 的方法将加载高用@2x解析资源文件在文件名中。 比例因子已添加到 UIScreen,UI
我的浏览器内 LED Display 对象在其 map 属性中存储了 LED 对象。每个 LED 都有 x 和 y 属性,以便知道它在 Canvas 上的位置,而 map 是一个 2D LED 数组(
我是一名优秀的程序员,十分优秀!