dpi重启后会恢复_DPI 设置过大该如何还原?

现在的消费类电子设备屏幕越做越小,分辨率却反而在往上增加,例如 Surface Pro,10.6 寸的屏幕,1080p 的全高清显示,会让 Windows 显示的文字变得异常的小。这个现象其实是因为屏幕点距比标准的要小而导致的(约207.82点/英寸,而标准的约为96点/英寸),显示效果虽更加细腻,但是 Windows 对文字的渲染仍旧是默认的 DPI(通过下文可以知道它是96点/英寸),所以文字也就变小了。

要让文字看起来不那么吃力,我们一般的做法是放大系统的 DPI。其实这个有点类似于数字图像采样的 PPI 的概念了,假设调高 Windows DPI,让 Windows 针对 UI 元素的采样分辨率变高,那么重新采样过后的 UI 元素会获得比之前更大的数字分辨率,长和宽均获得了更多的像素,在同一块屏幕上,占用的显示像素点就要比以前多,因此,你看到的元素就变大了。

可有的时候,万一我们自定义了一个过大的 DPI (例如500%),在应用并且重新登录后,可以发现系统界面元素变得过大,于是我们再也不能通过操纵 UI 的方式,前往控制面板找到这个设置将其改回来。此时我们有个校正的办法是重启到安全模式。

DPI 的设置是用户相关的,也就是说,你所做的 DPI 设置,仅对你当前的这个用户有效。因此,DPI 的设置也是保存在注册表的 HKCU 分支下面。比直接操作注册表更安全的方法是重启到安全模式,然后将 DPI 的设置改回正常以后,再重新启动电脑。这是因为,安全模式下不应用 DPI 缩放设置,所有 UI 元素的大小将恢复正常。

注意,在高级启动选项里,如果选择"启用低分辨率视频"模式,那么 UI 元素的尺寸还将是过大的,而且反而会加剧(因为分辨率更低了)。这个模式可以用来解决显卡驱动的一些问题,但是,DPI 设置与显卡驱动无关,因此请注意选择进入安全模式修复这一问题。

如果你还想了解 DPI 设置在注册表中存放的位置的话,那么以 Win8 为例,它位于 HKEY_CURRENT_USER\Control Panel\Desktop 项目下,键名为"LogPixels"。默认地,系统里不会有这个键和键值,但是如果你设置过 DPI 缩放,那么这个键就出现了。默认设置下,Windows 的 DPI 绝对值其实是96,只不过通过 DPI 设置界面是看不出来这一点的。这里给出 DPI 设置与注册表键值的对应关系:

DPI 设置

注册表键值

较小 - 100%

96

中等 - 125%

120

较大 - 150%

144

可以看出,注册表存放的键值是真实的 DPI 绝对值,而 UI 里面显示的百分比是基于"96 '=' 100%"这个定义的。因此,手动调整 DPI 设置后,你就可以轻松算出真实的 DPI 值了。对于像 Surface Pro 这样的设备,系统已经会自动将默认 DPI 设为 150%。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中可以使用 ImageIO 类的 write 方法来写入 PNG 和 JPEG 图片,并且可以设置 DPI。 对于 PNG 图片,可以使用 ImageWriteParam 对象来设置 DPI。代码示例如下: ```java BufferedImage image = ImageIO.read(new File("input.png")); ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next(); ImageWriteParam writeParam = writer.getDefaultWriteParam(); IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromRenderedImage(image), writeParam); String metadataFormatName = metadata.getNativeMetadataFormatName(); IIOMetadataNode pngNode = new IIOMetadataNode(metadataFormatName); IIOMetadataNode pHYsNode = new IIOMetadataNode("pHYs"); int dpi = 300; // 设置 DPI pHYsNode.setAttribute("pixelsPerUnitXAxis", Integer.toString((int) Math.round(dpi / 0.0254))); pHYsNode.setAttribute("pixelsPerUnitYAxis", Integer.toString((int) Math.round(dpi / 0.0254))); pHYsNode.setAttribute("unitSpecifier", "meter"); pngNode.appendChild(pHYsNode); metadata.mergeTree(metadataFormatName, pngNode); File output = new File("output.png"); ImageOutputStream stream = ImageIO.createImageOutputStream(output); writer.setOutput(stream); writer.write(metadata, new IIOImage(image, null, metadata), writeParam); stream.close(); writer.dispose(); ``` 对于 JPEG 图片,可以使用 JPEGImageWriteParam 对象来设置 DPI。代码示例如下: ```java BufferedImage image = ImageIO.read(new File("input.jpg")); ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); ImageWriteParam writeParam = writer.getDefaultWriteParam(); JPEGImageWriteParam jpegWriteParam = new JPEGImageWriteParam(Locale.getDefault()); int dpi = 300; // 设置 DPI jpegWriteParam.setDensityUnit(JPEGImageWriteParam.DENSITY_UNIT_DOTS_INCH); jpegWriteParam.setXDensity(dpi); jpegWriteParam.setYDensity(dpi); jpegWriteParam.setQuality(1.0f, false); writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); writeParam.setCompressionQuality(1.0f); File output = new File("output.jpg"); ImageOutputStream stream = ImageIO.createImageOutputStream(output); writer.setOutput(stream); writer.write(null, new IIOImage(image, null, null), jpegWriteParam); stream.close(); writer.dispose(); ``` 需要注意的是,设置 DPI 只是给图片添加了元数据,实际上并没有改变图片的像素大小和分辨率。要改变图片的像素大小和分辨率,需要对图片进行缩放操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值