java修改JPG图片DPI 不改变分辨率

package util;

import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.net.*;
import javax.imageio.*;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.Image;

import java.io.File;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.FileImageInputStream;
import javax.swing.ImageIcon;

import org.w3c.dom.Element;
import org.w3c.dom.Node;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class ImageManipulation {

    public static void main(String[] args) throws Exception {
        File infile = new File("D:/test/Scan_150925100019.jpg");
        File outfile = new File("D:/test/300.jpg");

        ImageReader reader = ImageIO.getImageReadersByFormatName("jpeg").next();
        reader.setInput(new FileImageInputStream(infile), true, false);
        IIOMetadata data = reader.getImageMetadata(0);
        BufferedImage image = ImageIO.read(infile);

        int w = 2550, h = -1;
//       Image rescaled = image.getScaledInstance(w, h, Image.SCALE_AREA_AVERAGING);
//       BufferedImage output = toBufferedImage(rescaled, BufferedImage.TYPE_INT_RGB);
//      BufferedImage output = ImageIO.read(outfile);

        Element tree = (Element) data.getAsTree("javax_imageio_jpeg_image_1.0");
        Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
        for (int i = 0; i < jfif.getAttributes().getLength(); i++) {
            Node attribute = jfif.getAttributes().item(i);
            System.out.println(attribute.getNodeName() + "="
                    + attribute.getNodeValue());
        }
        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();
        }

      public static BufferedImage toBufferedImage(Image image, int type) {
            int w = image.getWidth(null);
            int h = image.getHeight(null);
            BufferedImage result = new BufferedImage(w, h, type);
            Graphics2D g = result.createGraphics();
            g.drawImage(image, 0, 0, null);
            g.dispose();
            return result;
        }
}
你可以使用Java的`java.awt.image.BufferedImage`类和`javax.imageio.ImageIO`类来修改图片分辨率。下面是一个示例代码: ```java import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class ModifyResolution { public static void main(String[] args) throws IOException { // 读取图片 BufferedImage image = ImageIO.read(new File("input.jpg")); // 获取原图分辨率 int originalDpiX = (int) image.getProperty("dpi_x"); int originalDpiY = (int) image.getProperty("dpi_y"); // 修改分辨率 int newDpi = 300; int newWidth = (int) (image.getWidth() * newDpi / (double) originalDpiX); int newHeight = (int) (image.getHeight() * newDpi / (double) originalDpiY); // 创建新图片 BufferedImage newImage = new BufferedImage(newWidth, newHeight, image.getType()); newImage.createGraphics().drawImage(image, 0, 0, newWidth, newHeight, null); // 设置图片分辨率 newImage.setProperty("dpi_x", newDpi); newImage.setProperty("dpi_y", newDpi); // 保存新图片 ImageIO.write(newImage, "jpg", new File("output.jpg")); } } ``` 在上述代码中,我们首先使用`ImageIO.read`方法读取了一张图片,并使用`image.getProperty`方法获取了原图的分辨率。然后,我们根据需要的分辨率和原图的分辨率计算出新图片的宽度和高度,并使用`BufferedImage`类创建了一个新的图片对象。接着,我们将原图绘制到新图片上,并使用`setProperty`方法设置了新图片分辨率。最后,我们使用`ImageIO.write`方法将新图片保存到文件中。 需要注意的是,不是所有图片格式都支持设置分辨率。比如JPEG格式的图片可以设置分辨率,而PNG格式的图片则不支持设置分辨率。如果图片格式不支持设置分辨率,可以尝试使用前面提到的`ImageWriter`类来重新写入图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值