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

在Java中提高分辨率并减小图像大小

冉昊
2023-03-14
问题内容

当我第一次问这个问题时,我尽可能地提供了很多信息,因为我不知道如果有人可以提供解决方案对他们有什么帮助,但是从答案来看,我似乎并没有明确说明我的意思。

我将原始文本留在底部,并将其缩短。我希望这一点很清楚。

我正在处理从另一个程序返回的图像。我可以得到一个图像,例如在72 DPI时为8x10或在16D20时也是72DPI的相同图像。

我在用Java工作。我想做的是拍摄16x20图像并调整其大小。如果可能的话,我想只更改文件,而不是在72DPI时为16x20,而在144DPI时为8x10。

我知道像素数量仍然相同,但是观众会说图像的大小和DPI是多少,还有些人会将图像打开到完整尺寸,所以我宁愿他们将16x20视为较小的图像,更高的分辨率。

我可以用Java做到吗?我会丢失任何数据吗?我该怎么做-我可以只更改png或jpg文件中的元数据吗?

-----(以下是原始问题)-----

我已经看到了一些与此相关的问题,但这有些不同。

我知道您可以使用Java中的图像来降低图像分辨率(也在此处)。我所做的任何搜索都与降低图像的分辨率有关。

我有相反的问题。我正在处理要在72DPI中恢复的图像。好处是我可以增加图片的大小,所以我可以将大小设为100%,200%,400%等。所有图像均为72DPI,因此,如果我使用200%的缩放比例,然后在查看器中打开图像并使其尺寸与100%图像相同,则我看到的分辨率更高。

为了清楚起见-我正在从其他人那里获得图像,它可能是从PDF或图片生成的,但是我从另一个程序 获得
了图像。不管我做什么,此图像都是72DPI。我无法更改它,但是我可以将大小指定为200%,但它仍会返回72DPI,只是大小的两倍,并且具有更多细节。

我不是图形专家,这是我第一次完成任何使用图形的编程。输出可能是jpg或png,因此格式不是那么重要。(如果需要,我可能还可以使用其他格式。)

假设原始图片是一张照片-8“ x 10”,且DPI为72。如果我要求200%的缩放,我将获得72DPI的16“ x 20”图像。

我可以在Java中将较大的16“ x 20” 72DPI图像更改为8“ x 10”的144DPI图像而不会丢失数据吗?换句话说,将DPI加倍,但将尺寸减半?

而且,最重要的是,我可以做到这一点而不会丢失分辨率吗?(我认为可以做到。)


问题答案:

这很棘手,因为就像Java中的许多事情一样,您不能仅以简单的方式访问某些内容。Java不会跟踪DPI,但是会使用每毫米的点数。另外,另一个令人困惑的部分是您不能更改图像或BufferedImage中的此类信息。仅当通过ImageWriter写入BufferedImage时,才能更改此信息。

我能够做到这一点。如我所说,我可以指定返回给我的图像的缩放比例。无论缩放级别如何,输出均为72
DPI。我的目标是300DPI。我指定了400%的缩放比例。因此,在8英寸宽,72 DPI的图像上,向我返回了32英寸72
DPI的图像。我要做的就是将DPI指定为288(72 x 4),以覆盖我正在处理的默认72
DPI,然后在将其写出时,图像具有相同数量的像素,但被认为是在288 DPI,而不是72 DPI。

这是一个代码片段:

//假设已经有一个ImageWriter iw

ImageWriteParam writeParam = writer.getDefaultWriteParam();
ImageTypeSpecifier typeSpecifier =
       ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {
    continue;
}

//设置参数和信息

int DPI = 72 * scaling/100;
double dotsPerMilli = 1.0 * DPI / 10 / 2.54;
double checkDots = 1.0 * 144 / 10 / 2.54;
System.out.println("Dots per inch: " + DPI + ", DotsPerMilli: " + dotsPerMilli + ",
    CheckDots = " + checkDots);
IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0");
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);
root.appendChild(dim);
metadata.mergeTree("javax_imageio_1.0", root);

//从这里开始,只需使用ImageOutputStream写出文件

final ImageOutputStream stream = ImageIO.createImageOutputStream(outFile);
System.out.println("Output file: " + outFile);
try {
    writer.setOutput(ImageIO.createImageOutputStream(outFile));
    writer.write(metadata, new IIOImage(image_to_save, null, metadata),
    writeParam);
} catch (Exception e) {
    System.out.println("Caught exception " + e + " when trying to write out
        file.");
    System.exit(0);
} finally {
    stream.close();
}


 类似资料:
  • 注意:Photoshop 提供了已更新的“图像大小”对话框。请参阅调整图像大小,以了解更多信息。 关于像素尺寸和打印图像分辨率 像素尺寸测量了沿图像的宽度和高度的总像素数。分辨率是指位图图像中的细节精细度,测量单位是像素/英寸 (ppi)。每英寸的像素越多,分辨率越高。一般来说,图像的分辨率越高,得到的印刷图像的质量就越好。两幅相同的图像,分辨率分别为 72 ppi 和 300 ppi;套印缩放比

  • 我有一个尺寸为800x800的图像,其大小为170 kb。我想将此图像调整为600x600。调整大小后,我希望缩小图像大小。我该怎么做?

  • 我有一个java的列表。awt。图像,每个分辨率为300 DPI。我想打印它们,当我开始打印这些图像时(使用javax.PrintService API),只打印一些图像的一部分,因为Java的打印/3D类默认使用72DPI(相对于我的图像的300 DPI)。但是,当我使用72 DPI的图像(与Java默认值具有相同的分辨率)时,所有图像都可以很好地打印(打印整个图像时,而不仅仅是其中的一部分)。

  • 问题内容: 我想提高图像的分辨率。我使用了PDFRenderer-0.9.0 jar。它是从java.net 下载的,用于将PDF页面转换为图像。 我想将46_2.pdf PDF文件转换为image。转换后的46_2.png图像尺寸较小, 所以我想将图像尺寸增加到。 我以前尝试过 PdfBox 将PDF页面转换为PNG图像文件。有个问题。因此,我尝试使用 PdfRenderer 库进行图像转换。

  • 为了更好的提升微页面在移动端的阅读体验,对于微页面图片上传做了以下限制: 图片大小最大2M 图片分辨率最大1080px; 在遇到设计师给出超大分辨率的高清图片时,可通过 1、在系统文件夹内找到需要调整的图片,右键选择【编辑】,进入画图编辑图片; 2、在画图左上区域找到【重新调整大小】并点击,在弹出窗口【调整大小和扭曲】中选择重新调整大小依据为“像素”,勾选“保持纵横比”,在水平输入框中输入750(

  • 问题内容: 我需要使用Java程序减小图像的大小(而不是宽度和高度)。他们为此提供了任何好的API吗? 我需要将大小从1MB减少到大约50kb-100 kb。当然,分辨率会降低,但这并不重要。 问题答案: 这是工作代码 这段代码对我来说很棒。如果需要调整图像大小,则可以在此处更改x和y比例J;