首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中提高图像分辨率和缩小图像大小的方法

Java中提高图像分辨率和缩小图像大小的方法
EN

Stack Overflow用户
提问于 2012-12-20 17:59:07
回答 2查看 12K关注 0票数 2

当我第一次问这个问题时,我尽可能多地列出了一些信息,因为我从来不知道,如果有人能给我一个解决方案,他们会有什么帮助,但从答案来看,我似乎没有明确说明我的观点。

我把原文放在最下面,然后把它缩短。我希望这说明得很清楚。

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

我在爪哇工作。我想做的是采取16x20的图像,并调整它的大小。如果可能的话,我只想更改文件,所以不是在72DPI为16x20,而是在144DPI时为8x10。

我知道它仍然是相同的像素数,但是观众会说一张图像有多大,新闻部是什么,还有一些人会打开一张图像,让它的大小完全一样,所以我宁愿他们把16x20当作分辨率更高的更小的图像。

我能用Java做这个吗?我会失去任何数据吗?我该如何做呢?我可以只更改png或jpg文件中的元数据吗?

-(这里的原始问题)

我看到了一些接近这个的问题,但这有点不同。

我知道您可以使用decrease image resolution (also here)中的图像。我所做的任何搜索都与降低图像的分辨率有关。

我有相反的问题。我正在处理一幅在72 with中得到的图像。优点是我可以增加图片的大小,所以我可以使尺寸100%,200%,400%等等。所有的图像都是72 200,所以如果我使用200%的缩放,然后打开一个观众的图像,并使它的大小与100%的图像,我看到了一个更好的分辨率。

为了清晰起见,我正在从其他人那里得到一个图像,它可以从PDF或图片中生成,但我是另一个程序生成的图像。不管我做什么,这张图片都是72 do。我不能改变这一点,但我可以指定200%的大小,它仍然返回到72 the,只有两倍大和更多的细节。

我不是图形专家,这是我第一次做任何使用图形的编程。输出可以是jpg或png,所以格式没有那么重要。(如果需要的话,我也可以使用其他格式。)

假设原图是一张照片如果我要求200%的缩放,我会得到一个在72 for的16“x20”图像。

在Java中,我能否将较大的16“x20”72 data图像更改为144 data图像,即8“x10”,而又不丢失数据?换句话说,是新闻部的两倍,但把规模削减了一半?

最重要的是,我能在不失去决心的情况下做到这一点吗?(我认为这是可以做到的。)

EN

Stack Overflow用户

回答已采纳

发布于 2012-12-27 07:11:33

这很棘手,因为就像Java中的很多东西一样,您不能仅仅以一种简单的方式访问某些东西。Java不跟踪DPI,但它确实使用每毫米的点。另外,另一个令人困惑的地方是,您不能在图像或BufferedImage中更改此类信息。只有在通过BufferedImage编写ImageWriter时,才能更改此信息。

我能做到的。正如我所说的,我可以指定返回给我的图像的缩放。无论放大程度如何,输出都是72 DPI。我的目标是300 was。我指定了400%的缩放级别。所以,在一张8英寸宽的72 DPI的照片上,我又看到了72 DPI的32“图像。我所要做的就是指定一个288像素(72x4)来覆盖我正在处理的默认72个DPI,然后当它被写入时,图像具有相同的像素数,但是被认为是在288个DPI而不是72个DPI上完成的。

下面是一个代码片段:

//假设已经有一个ImageWriter iw

代码语言:javascript
运行
复制
ImageWriteParam writeParam = writer.getDefaultWriteParam();
ImageTypeSpecifier typeSpecifier =
       ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {
    continue;
}

//设置参数和信息

代码语言:javascript
运行
复制
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写出文件

代码语言:javascript
运行
复制
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();
}
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13977858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档