我需要能够将应用程序清单中的dpiAware属性设置为"每个监视器".属性中的可用选项仅用于启用或禁用DPI感知.这些设置都不适合我.如果我没有在exe中嵌入清单,那么我可以获得我想要的应用程序行为,然后手动编辑清单.我想自动生成并嵌入清单.有什么我想念的吗?(我使用的是Visual Studio 2013.)
在Qt地图应用程序(QGIS)中,地图画布是QGraphicsItem.我们不使用任何OpenGL,每个元素都使用QPainter渲染.
除地图画布外,我们的应用程序在HiDPI上正确显示.
查看地图中的像素线:
我看了什么:
与画家,我们正在使用QPainter::Antialiasing
.
在这里发布代码并不容易,但这里是一个链接到渲染行的源代码.
我一直试图做一个最小的再现例子,但我仍然在这里失败.
提示是,只要鼠标位于地图画布上,光标的大小就会加倍(它太大).我会说大约是我设备像素比的 2倍.
我不确定这是一个只有Mac的问题(它似乎也发生在Linux上,但不是在Windows上).关于可伸缩性的Qt文档声明Mac以不同方式处理它.
我真的不知道该寻找什么,我希望得到一些提示.
我使用Gtk.Image
由a支持的 aGdkPixbuf.Pixbuf
来显示照片。我缩放照片以适应可用空间以响应size-allocate
父小部件的信号。问题是在 HiDPI 显示器上,每个维度都是逻辑像素而不是设备像素,因此会发生以下情况:
GdkPixbuf.Pixbuf
到我从size-allocate
信号中获得的尺寸,照片会占用所需的物理空间,但它只使用显示器分辨率的一半(假设设备像素与逻辑像素的比率为 2:1)。GdkPixbuf.Pixbuf
到get_scale_factor()
我从size-allocate
信号中得到的维度的倍数,那么照片将占据物理空间的两倍(即,它无法放入窗口中)。我怎样才能让 GTK 知道Pixbuf
我提供给图像的对应于设备像素而不是逻辑像素?
更新:这是我尝试过的(这些是我没有任何缩放的简化示例,只是尝试显示未缩放的图像):
尝试 1:
image = Gtk.Image()
image.set_from_file("subpixel.png")
Run Code Online (Sandbox Code Playgroud)
尝试 2:
surface = cairo.ImageSurface.create_from_png("subpixel.png")
image = Gtk.Image()
image.set_from_surface(surface)
Run Code Online (Sandbox Code Playgroud)
尝试 3:
pb = GdkPixbuf.Pixbuf.new_from_file("subpixel.png")
image = Gtk.Image.new_from_pixbuf(pb)
self.add(image)
Run Code Online (Sandbox Code Playgroud)
尝试 4:
pb = GdkPixbuf.Pixbuf.new_from_file("subpixel.png")
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, pb.get_width(), pb.get_height())
context = cairo.Context(surface)
Gdk.cairo_set_source_pixbuf(context, pb, 0, 0)
context.paint()
image = Gtk.Image()
image.set_from_surface(surface)
Run Code Online (Sandbox Code Playgroud) 我在安装了KDE Neon的笔记本电脑上运行android模拟器26.1.3.KDE Neon是基于Ubuntu 16.04和最新KDE的发行版.我的笔记本电脑的屏幕分辨率是14"3840X2160.物理DPI == 315.在KDE'系统设置' - >'字体' - >'强制字体DPI'设置为196.
我在ADV管理器中启动了一个Nexus_5X_API_26仿真器实例.设备配置文件:
hw.lcd.width = 1080
hw.lcd.height = 1920
hw.lcd.depth = 16
hw.lcd.density = 420
Run Code Online (Sandbox Code Playgroud)
模拟器显示如下.怎么纠正这个?
我下载并安装了最新的Java 9早期版本,并且很高兴地发现Windows上的Java Swing应用程序现在可以以正确的大小呈现组件.使用HiDPI显示器的客户不再需要以预期宽度和高度的一半使用我的应用程序.
但是我注意到在我的Swing应用程序中,我自己的图标只是缩放到宽度和高度加倍,使它们看起来很锯齿.
我确实拥有正常尺寸(例如foobar.png)和双倍宽度/高度(例如foobar@2x.png)的全套图标.我使用Apple命名约定.
如何让Java 9在可用的情况下轻松找到并使用图像的更高分辨率版本,而无需手动编写代码?
代码示例总是让问题更清晰,Java 9还有一个多分辨率图标类,我可以使用它来编译和运行以下代码吗?
import javax.swing.*;
public class ScratchSpace {
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("I work in HiDPI!");
// can I replace the following line with some magical new method that automatically loads the same icon at multiple resolutions
// so that Swing chooses the correct one when rendering, depending on the current scale of the current display?
Icon icon = new IconWithMultipleSizes("foobar.png"); …
Run Code Online (Sandbox Code Playgroud) 我有一台新的4K显示器,一切看起来都很棒,但使用NetBeans进行编码很困难.控件非常小,java框架看起来非常小.
我已经看到一些有关此问题的Stackoverflow帖子,他们说我应该在首选项文件中添加一行,以便禁用hi-dpi模式,但我的java框架仍然很小.
我已经将HiDPI笔记本电脑上的xserver配置简化为:
displayManager
:lightdm(自动登录,不打招呼)windowManager
:xmonad desktopManager
:无(xterm已禁用)除了在某些地方进行DPI缩放外,一切都工作正常。具体来说:光标大小和默认的 tty字体都很小。由于我的X设置(如下所示),应用程序-终端模拟器,Firefox等-可以很好地缩放。
游标大小以及随之而来的缓慢运动是最大的痛苦。
所以我的问题是:为什么在某些地方而不是其他地方会看到适当的缩放比例?光标大小和其他“核心”显示内容是由什么引起的?
我做过/尝试过的东西:
?services.xserver.dpi = 180;
(设置xserver
标志)
?.Xresources设置
Xft.dpi: 180
Xft.autohint: 0
Xft.lcdfilter: lcddefault
Xft.hintstyle: hintfull
Xft.hinting: 1
Xft.antialias: 1
Xft.rgba: rgb
Run Code Online (Sandbox Code Playgroud)
? export GDK_SCALE=2
? export GDK_DPI_SCALE=0.5
? export XCURSOR_SIZE=32
? export QT_AUTO_SCREEN_SCALE_FACTOR=1
相关(?)GH问题:
使用NixOS 18.03
我有一个应用程序,它将使用 JLabel 和图标大小为 32x32 的 ImageIcon。
我现在想使用 64x64 图像,加载它并将其大小调整为 32x32(如果 DPI 较低),否则将其用作高 DPI 图像。
调整大小很容易,这个技巧的例子如下:
ImageIcon icon = ...
Image lowRes = icon.getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH);
return new ImageIcon(lowRes);
Run Code Online (Sandbox Code Playgroud)
但是,我无法找到将 ImageIcon 设置为高 DPI 图像的方法。
我尝试过使用 MultiResolutionImage 但没有成功。
编辑:尝试以天真的方式使用 MultiResolutionImage:
private ImageIcon loadIcon(String iconName)
{
ImageIcon icon = new ImageIcon(getClass().getClassLoader()
.getResource("res/icons/toolbar/" + iconName));
BaseMultiResolutionImage baseMultiResolutionImage = new BaseMultiResolutionImage(
icon.getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH),
icon.getImage()
);
return new ImageIcon(baseMultiResolutionImage);
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
2019-06-11 14:00:45,962 ERROR [AWT-EventQueue-0] Catch.all - Uncaught exception on [AWT-EventQueue-0]: Invalid Image variant
java.lang.IllegalArgumentException: …
Run Code Online (Sandbox Code Playgroud) 更新至2017.2后,Intellij IDEA无法在Dell Ultrasharp U2415b上正确扩展.图标非常大,工作空间非常小.
我已经检查过,Intellij用HiDPI支持改变了一些东西.
有人遇到同样的问题吗?
Java 8中没有适当的HiDPI支持.
在Java 9中,JavaFx应用程序正确扩展到它们所在的监视器.例如,如果我的监视器设置为150%的缩放,Java应用程序将缩放到150%.
见:http://openjdk.java.net/jeps/263
但是,出于测试目的,我需要能够在Windows 10中使用java.exe标志禁用扩展.如何实现此目的?
另外,也许我可以在应用程序本身内以编程方式禁用(并重新启用)?