提高分辨率和Java中减少图像的大小(Increasing Resolution and Reduc

2019-07-17 11:36发布

当我第一次问这个,我包括尽可能多的信息,我可以,因为我从来不知道什么会帮助别人,如果他们可以给马的解决方案,但是从答案,似乎我没有让我的观点明确。

我要离开底部的原始文本和缩短这个。 我希望清楚。

我从另一个程序退还给我的图像工作。 我可以在16x20得到这,例如图像,8×10 72 DPI或相同的图像,也为72DPI。

我在Java中工作。 我想要做的就是以16x20图像,并调整其大小。 如果可能的话,我想只是改变了文件,这样,而不是在72DPI为16x20,这是8x10的在144DPI。

我知道,它仍然是相同的像素数,但观众会说的形象有多大和DPI是什么,也有一些打开图像到它的全尺寸,所以我宁愿他们对待16x20与较小的图像更高的分辨率。

我能做到这一点在Java中? 我会丢失任何数据? 我会怎么做 - 我可以更改PNG或JPG文件的元数据?

-----(以下这里原来的问题)-----

我已经看到了接近这几个问题,但是这是一个有点不同。

我知道你可以降低图像分辨率在Java(图像也在这里 )。 我已经做了所有的搜索一直关注降低图像的分辨率。

我有相反的问题。 我与我找回在72DPI的图像工作。 其优点是,我可以增加图片的大小,这样我就可以使尺寸为100%,200%,400%等。 所有图像都在72DPI,所以如果我使用200%缩放,然后在浏览器打开图像,并使其大小相同100%像,我看到一个更好的解决方案。

为了清楚-我从别人那里得到的图像,也可能是从一个PDF或图片生成,但我从另一个节目中的图像。 无论我做什么,这个形象是在72DPI。 我不能改变的,但我可以200%指定大小和它仍然回来在72DPI,只是大了一倍,并与更多的细节。

我没有图形专家,这是我第一次做了一个使用图形任何编程。 输出可以是JPG或PNG,所以格式并不重要。 (我可以在需要时也可能使用其他格式。)

假设原始图像是照片 - 8" ×10" ,并在72 DPI。 如果我问一个200%缩放,我会在72DPI 16" ×20" 的形象。

我可以,在Java中,即更大的16" ×20" 图像72DPI更改为144DPI图像这是8" ×10" ,而不会丢失数据? 换句话说,双DPI,但削减规模的一半?

而且,最重要的是,我能做到这一点,而不会丢失的决议? (我认为是可以做的。)

Answer 1:

不,如果你把一个8x10的72dpi的图像,并要求200%的缩放,你会在36 dpi的获得16x20。 你不能神奇地提高图像清晰度。

什么重要的是图像中的像素的总数。 该声明DPI是DPI将在特定的大小什么。 把你的8x10形象在72dpi的。 它具有576x720像素。 如果放大到200%,你仍然有相同数量的像素,但现在他们会在两次线性尺寸铺开,这意味着单个像素会更大。 有些软件将尝试通过插值像素,即通过平均的近邻创造新的像素提高分辨率。 这可以给更高的分辨率的印象,但图像不包含任何数据。 它总是有软化图像,尤其是任何锋利的边缘或线的影响。

如果您减小图像的大小而不重新取样,你就增加了打印或显示分辨率,但图像变得更小。 对于相同的图像,增加DPI到144会降低图像的大小,以4×5。



Answer 2:

这是棘手,因为,像这么多的在Java中,你不能只访问一个简单的方法的东西。 Java不跟踪DPI的,但它确实使用每毫米的点。 此外,这是混淆另一部分是,你不能改变这种信息的图像,或以一个BufferedImage。 您只能更改当您外出时通过一个ImageWriter写一个BufferedImage此信息。

我能做到这一点。 正如我所说的,我可以指定返回到我的图像缩放。 不管什么缩放级别,输出为72 DPI。 我的目标是300DPI。 我指定的400%缩放级别。 这样,8" 72 DPI的宽图像,即返回到我一个32" 72 DPI的图像上。 我所要做的就是指定的288(72×4)一个DPI覆盖缺省的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();
}


文章来源: Increasing Resolution and Reducing Size of an Image in Java