【问题标题】:Reduce image PPI (Pixels Per Inch) with physical dimensions preservation通过保留物理尺寸降低图像 PPI(每英寸像素数)
【发布时间】:2020-07-15 12:11:10
【问题描述】:

我正在为印刷行业开发软件,我需要将上传的高质量高 PPI(例如 300)图像转换为具有相同物理尺寸(以英寸为单位)的低 PPI(例如 40)。
例如,将 300 PPI 和 10x10(英寸 x 英寸)的图像转换为 50 PPI 和 10x10(英寸 x 英寸)的图像
这种转换很重要,因为我们希望向用户显示带有其他透明层的低质量图像,因为要预览实际的最终打印结果。

this image is another example

我如何在 Java 或 Kotlin 中做到这一点?

【问题讨论】:

  • 值得添加您想对结果做什么。显示吗?在哪里以及如何?只需将其另存为另一个修改后的文件?
  • 我正在为印刷行业开发软件,我需要将上传的高质量高PPI(例如300)图像转换为具有相同物理尺寸(以英寸为单位)的低PPI(例如40) , 与其他透明图层一起显示给用户,以预览实际的最终打印结果。
  • 请在问题中澄清这一点,而不是在 cmets 中
  • 对不起,当然@Fureeish

标签: java kotlin image-processing graphics


【解决方案1】:

首先,请耐心等待,因为我既不了解打印过程,也不了解图形术语。这个答案假设(用我自己的话来说)目标是拍摄图像并对其进行修改,以减少细节 - 显示图像所需的像素更少,但尺寸保持不变。如果事实证明我误解了目标,请随时指出。我要么尝试编辑答案,要么想出一些新的东西。


我提出的解决方案是拍摄图像,将其缩小并将其拉伸回相同的大小:

val path = "Y:\\our\\path\\\\to\\directory\\"

val sourceImage = ImageIO.read(File("${path}original.png"))

val smallerImage = BufferedImage(
        sourceImage.width / 2,
        sourceImage.height / 2,
        sourceImage.type
)

var graphics2D = smallerImage.createGraphics()
graphics2D.drawImage(
        sourceImage,
        0,
        0,
        sourceImage.width / 2,
        sourceImage.height / 2,
        null
)
graphics2D.dispose()

这里,smallerImage 被缩小了 - 我们现在使用的像素比原来使用的像素少 4 倍(因为我们将宽度和高度都缩放了 2 倍)。

这实现了使用更少像素的目标,但没有保留大小 - 它被缩小了。我们现在需要将其拉伸回原始大小,但现在我们将使用更少的像素:

val stretched = smallerImage.getScaledInstance(
        sourceImage.width,
        sourceImage.height,
        Image.SCALE_DEFAULT
)

val destination = BufferedImage(
        sourceImage.width,
        sourceImage.height,
        sourceImage.type
)

graphics2D = destination.createGraphics()
graphics2D.drawImage(stretched, 0, 0, null)
graphics2D.dispose()

最后,我们将图片保存到一个文件中:

val destinationImageFile = File("${path}destination.png")
ImageIO.write(destination, "png", destinationImageFile)

我们完成了。图片originaldestination


保存的像素数量完全取决于您使用的比例因子。您必须使用缩放来实现精确的像素数量节省。

【讨论】:

  • 非常感谢您的解决方案,我尝试了这个技巧,但它不起作用。因为当我们需要降低 PPI 并保留物理尺寸时,高度和宽度上的像素数也必须减少。请参阅我添加到答案中的附加图片。
  • 对不起:*问题
  • @BacheSeyyed 但 PPI 不是严格依赖于打印机并且与光栅表示无关吗?在虚拟表示中没有 PPI 这样的东西——只有像素。为了显示将要打印的图像的确切尺寸和分辨率(确切视图),您必须了解您的屏幕尺寸、分辨率和打印机规格。这不是可以以通用方式解决的问题。另一方面,如果您希望在屏幕上显示两张图片,使它们看起来占据相同的空间,那么它们必须具有相同的像素数
  • @BacheSeyyed 在您链接的照片中,您有两张相同大小的照片。一个不能是 288x432 而另一个是 1200x1800。任何一个都必须缩放,以便在显示期间它们的尺寸匹配。我希望我能帮助你完成你的任务,我希望我能正确理解问题所在。但是,cmets 部分不适合这种聊天 - 我希望我们可以将其移至聊天,但该权限需要 20 声望。
猜你喜欢
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 2012-01-18
  • 2014-07-03
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
相关资源
最近更新 更多