Java图片处理小结

java图片处理小结

java图片处理

  1. 图片 包括物理长度,像素,dpi。 像素 / dpi = 物理长度(英寸)
  2. 一般需要打印出来的图片的dpi最少要设置成300dpi,所以有一些时候,我们就要将上传的图片进行修改dpi,然后进行拉伸
  3. 一下代码包括修改图片格式,设置dpi的代码
	@Test
	public void reSizePic() throws  Exception{
        String path = "/Users/wb-mac/Documents/demo/spring-boot-demo/src/main/resources/pic/1gif.gif";
        String path2 = "/Users/wb-mac/Documents/demo/spring-boot-demo/src/main/resources/pic/4gif.jpeg";
        String path3 = "/Users/wb-mac/Documents/demo/spring-boot-demo/src/main/resources/pic/4gifdpi.jpeg";
        File inFile = new File(path);
        File outFile = new File(path2);
        File outFileDpi = new File(path3);
        BufferedImage oriImg = ImageIO.read(inFile);
        BufferedImage reSetTypeImg = fileService.changeImgType(oriImg, oriImg.getWidth(), oriImg.getHeight());
        ImageIO.write(reSetTypeImg, "jpeg", outFile);
        fileService.setImgDpi(outFile, outFileDpi);
    }
    
	//将图片绘制到一个新的图片上,新图片的格式根据“ImageIO.write(reSetTypeImg, "jpeg", outFile)”自定
	public BufferedImage changeImgType(BufferedImage srcImage, int width, int height) {
        Image image = srcImage.getScaledInstance(width, height, BufferedImage.TYPE_INT_RGB);
        BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = newImage.createGraphics();
        g2d.drawImage(image, 0, 0, Color.WHITE, null);
        return newImage;
     }
     //设置jpeg格式图片的DPI,增加图片质量
     public void setImgDpi(File inFile, File outFile) throws Exception {
        String formatName = "jpeg";
        ImageReader imgReader = ImageIO.getImageReadersByFormatName(formatName).next();
        imgReader.setInput(new FileImageInputStream(inFile), true, false);
        IIOMetadata data = imgReader.getImageMetadata(0);
        BufferedImage image = ImageIO.read(inFile);
        FileOutputStream fos = new FileOutputStream(outFile);
        JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(fos);
        JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image);
        jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
        jpegEncodeParam.setXDensity(300);
        jpegEncodeParam.setYDensity(300);
        jpegEncoder.encode(image, jpegEncodeParam);
        fos.close();
    }
    //设置png格式图片的DPI,增加图片的质量
public byte[] setPngDpi(BufferedImage image, int dpi) throws Exception{
        for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName("png"); 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;
            }
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            ImageOutputStream stream = null;
            try {
                setDPI(metadata, dpi);
                stream = ImageIO.createImageOutputStream(output);
                writer.setOutput(stream);
                writer.write(metadata, new IIOImage(image, null, metadata), writeParam);
            } finally {
                try {
                    stream.close();
                } catch (IOException e) {
                }
            }
            return output.toByteArray();
        }
        return null;
    }

    private void setDPI(IIOMetadata metadata, int dpi) throws IIOInvalidTreeException {
        // for PMG, it's dots per millimeter
        double INCH_2_CM = 2.54d;
        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);
    }

TIFF格式的图片

在java8 及之前版本中,jdk 中的 ImageIO 读取图片内容会失败,解决办法使用 java9 或者使用第三方插件。

<dependency>
    <groupId>com.github.lafa.twelvemonkeyspurejava.imageio</groupId>
    <artifactId>imageio-tiff</artifactId>
    <version>1.0.1</version>
    <type>pom</type>
</dependency>

地址:https://haraldk.github.io/TwelveMonkeys/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值