【问题标题】:How to change JPEG image DPI using java [duplicate]如何使用java更改JPEG图像DPI [重复]
【发布时间】:2014-05-05 17:21:55
【问题描述】:

谁能帮帮我..?

我有一些从 JPanel 创建的 .jpg。不幸的是,它的 DPI 是 72。是否有编程方式来更改这些 .jpg 的 DPI? 现在我使用以下代码更改 DPI。但是当我尝试构建项目时它会出现一些问题。

`JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(new   FileOutputStream(outfile));
        JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image);
        jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
        jpegEncodeParam.setXDensity(300);
        jpegEncodeParam.setYDensity(300);
        jpegEncoder.encode(image, jpegEncodeParam);`

提前致谢:)

【问题讨论】:

  • @srf 我用这个。但分辨率仍为 72。我需要分辨率为 300
  • 这个问题已经被问及回答here
  • @TheNawaKer 谢谢你。但是在JPEG图像的情况下它有一些问题。

标签: java swing jakarta-ee


【解决方案1】:

您可以使用 Graphics2D 方法(来自 java.awt)缩放图像。 http://www.mkyong.com/java/how-to-resize-an-image-in-java 的本教程对其进行了深入的解释。

这是一个例子

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("/your image.jpg");
        File outfile = new File("/your image.jpg");

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

        int w = 600, h = -1;
         Image rescaled = image.getScaledInstance(w, h, Image.SCALE_AREA_AVERAGING);
         BufferedImage output = toBufferedImage(rescaled, BufferedImage.TYPE_INT_RGB);

        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(output);
        jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
        jpegEncodeParam.setXDensity(300);
        jpegEncodeParam.setYDensity(300);
        jpegEncoder.encode(output, 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;
        }
}

【讨论】:

  • @Rahul Dass 感谢您的回复。我想将分辨率更改为 300。不调整图像大小
  • @NikhilaKN 你一定是在谈论 dpi 而不是分辨率吧?
  • @Rahul Dass 谢谢你指出我的错。我按照你的建议使用上述方法。但它有一些pblms。创建jar文件有一些错误。与JPEGImageEncoder、JPEGEncodeParam有关的。
  • @NikhilaKN 你能附上日志文件吗?或者你能详细说明一下错误吗?
  • @Rahul Dass 以下错误,当我构建项目时出现错误: com.sun.image.codec.jpeg 包不存在 import com.sun.image.codec.jpeg.JPEGCodec;错误:com.sun.image.codec.jpeg 包不存在 import com.sun.image.codec.jpeg.JPEGEncodeParam;错误:找不到符号 JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(new FileOutputStream(outfile));符号:JPEGImageEncoder 类错误:找不到符号 JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(new FileOutputStream(outfile));符号:变量JPEGCodec
【解决方案2】:

有一个关于分辨率的类似问题,在following SO question here 中回答。

一般来说,你可能对学习图像处理算法感兴趣,描述here

降低分辨率的基本概念是您有选择地 从图像中删除数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2013-10-19
    • 2011-05-24
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多