当前位置: 首页 > 面试题库 >

Java如何在图像中设置DPI信息?

江鸿羲
2023-03-14
问题内容

我有一个想要导出高分辨率(或更确切地说是高像素密度?)图像以进行打印的应用程序-例如,我希望以每英寸250点(DPI)的速度打印图像,而不是默认值,据我了解是72 DPI。

我正在使用带有Graphics2D对象的BufferedImage绘制图像,然后使用ImageIO.write()保存图像。

知道如何设置DPI吗?


问题答案:

Kurt的答案说明了这一点,但我仍然花了一些时间才能运行它,因此这是保存PNG时设置DPI的代码。要找到合适的作家还有很多事情要做……

 private BufferedImage gridImage;
 ...

 private void saveGridImage(File output) throws IOException {
    output.delete();

    final String formatName = "png";

    for (Iterator<ImageWriter> iw = 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;
    }
 }

 private void setDPI(IIOMetadata metadata) throws IIOInvalidTreeException {

    // for PMG, it's dots per millimeter
    double dotsPerMilli = 1.0 * DPI / 10 / INCH_2_CM;

    IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");
    horiz.setAttribute("value", Double.toString(dotsPerMilli));

    IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");
    vert.setAttribute("value", Double.toString(dotsPerMilli));

    IIOMetadataNode dim = new IIOMetadataNode("Dimension");
    dim.appendChild(horiz);
    dim.appendChild(vert);

    IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0");
    root.appendChild(dim);

    metadata.mergeTree("javax_imageio_1.0", root);
 }


 类似资料:
  • 我陷入了一个问题,当试图设置图像和文本并排,然后它不显示完美,结账下面我分享了我的代码。 这是我的形象 https://ibb.co/sks3bjm 我想要这样 https://ibb.co/rhfkbkx index.html

  • 问题内容: 我想用Java制作图像,然后在尺寸为150 x 100毫米的标签上的300dpi标签打印机上打印。如何制作图像,以便将线条(或任何种类的元素)准确地打印在位置(10,10)(以毫米为单位),并在位置(10,50)处结束? 换句话说:我的挑战不是如何制作一条线(我使用的是Graphics2D,bufferedImage),而是如何准确地知道该行在标签上的位置(以毫米为单位)。 有任何想法

  • 问题内容: 谁能建议我如何将.TIF格式的图像存储到该图像并将其添加到列表模型?我试过了,但是给了我。 在这里,我编辑了代码,这是我的错误msg 异常,位于ListImage1.main(ListImage1.java:48)的javax.swing.ImageIcon。(ImageIcon.java:228)的线程“ main”中java.lang.NullPointerException 问题

  • 我正试图为主页设置一个背景图像。我是从屏幕开始获得图像位置,填充宽度,但不是高度。我的代码中是否遗漏了什么?颤振有图像标准吗?图像缩放是否基于每个手机的屏幕分辨率?

  • 这是一个关于移动设备的图像及其大小的问题。 所以假设我想要一个全手机屏幕的图像。我这里假设屏幕是320*480,这似乎是一致的。 当我在Photoshop或MS Paint中制作图像时,我可以选择像素/英寸(好吧,也许不是油漆,但你明白我的漂移)。默认值是72像素/英寸,这是要一直保持的吗? 一些设备具有更高的dpi——我认为“默认”是160 dpi——因此,对于一个240dpi的设备,为了显示我

  • 在fb状态下粘贴wordpress url会带来一个特色图片和一些文本 而当我将我的(核心php站点)url置于fb状态时,它只显示文本,但没有选择任何图像,而我在该页面上有10多个图像 我搜索了很多,但几乎所有的帖子都与wordpress相关,而我不知道如何在php/html(非wordpress)上为页面制作图像特色图像。是否有一些html标记、属性或其他方法?