java处理图像减小大小不改变像素_在Java中提高分辨率并减小图像大小

小编典典

这很棘手,因为就像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();

}

2020-10-12

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值