【问题标题】:How to set Dots Per Square Inch (DPI) for PNG in Java?如何在 Java 中为 PNG 设置每平方英寸点数 (DPI)?
【发布时间】:2012-05-19 07:46:10
【问题描述】:

让我从我没有代码开始,我不知道我应该做什么。显然,信息存储在 .png 文件的元数据中。我认为这应该不难做到,但事实证明这是一个挑战。

唯一看起来有点用处的是堆栈溢出的以下帖子。

How to set DPI information in an image?

但是,我尝试使用提供的代码和提供的网站来执行此类操作,但一无所获。

当我尝试使用迭代器时,如下所示,iw.hasNext() 和 iw.next() 都出现错误。

错误是:

  • 没有为 HTMLDocument.Iterator 类型定义方法 hasNext()
  • 类型不匹配:无法从 void 转换为 ImageWriter

    for (Iterator iw = (Iterator) ImageIO.getImageWritersByFormatName(formatName); iw.hasNext;) { ImageWriter writer = iw.next();

我的问题是,我从哪里开始,我需要寻找什么?有没有你知道的或者你自己做过的例子?


附注我关于“如何在图像中设置 DPI 信息?”的问题。帖子是这个...

  1. 为什么当我像他一样使用迭代器时,会出现错误?
  2. “INCH_2_CM”是什么意思?

我更改他的代码的方式如下...


    for (Iterator iw = (Iterator) ImageIO.getImageWritersByFormatName(formatName); iw.hasNext();) {
       ImageWriter writer = iw.next();
       ImageWriteParam writeParam = writer.getDefaultWriteParam();
       ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
       IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
       if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {
          continue;
       }

       setDPI(metadata);

       final ImageOutputStream stream = ImageIO.createImageOutputStream(output);
       try {
          writer.setOutput(stream);
          writer.write(metadata, new IIOImage(gridImage, null, metadata), writeParam);
       } finally {
          stream.close();
       }
       break;
    }

【问题讨论】:

  • INCH_2_CM 可能是一个等于 2.54 的 final 变量,它是将长度以英寸为单位的乘法常数转换为其以厘米为单位的值。

标签: java iterator png stack-overflow dpi


【解决方案1】:

您的代码在 javax.swing.text.html.HTMLDocument.Iteratorjava.util.Iterator 类之间混淆了。他的代码使用后者,但您的代码似乎使用的是前者。使用完全限定类型,或弄清楚如何修改您的导入。

【讨论】:

  • 你说得对,我觉得自己像个白痴。没有我展示我的导入,你是怎么想出来的?
  • The method hasNext() is undefined for the type HTMLDocument.Iterator很清楚。
  • 老实说,该图书馆的设计者知道未来可能会出现混乱,这是一个糟糕的决定。很有可能,他们希望人们简单地使用增强的 for 循环而不是迭代器。
  • @corsiKa:你说得对,这是一个愚蠢的命名决定。该决定早于增强 for 循环,因此没有任何借口。我总是被java.util.Listjava.awt.List 咬。
猜你喜欢
  • 2012-06-17
  • 1970-01-01
  • 2014-11-03
  • 2021-08-28
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多