0

can any one help me..?

I have some .jpg's created from JPanel. Unfortunately its DPI is 72. Is there a programmatic way to change the DPI of these .jpg's ? Now i use following code for change DPI. But it have some issues when i try to build project.

`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);`

Thanks in advance :)

Möbius
  • 17
  • 1
  • 1
  • 9

2 Answers2

2

You can scale an image using Graphics2D methods (from java.awt). This tutorial at http://www.mkyong.com/java/how-to-resize-an-image-in-java explains it in depth.

here is an example

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
  • 126
  • 1
  • 5
  • @ Rahul Dass thnks for ur response. I want to change resolution to 300. not resizing an image – Möbius May 05 '14 at 06:54
  • @NikhilaKN you must be talking about dpi not resolution right? – Rahul Dass May 05 '14 at 06:58
  • @ Rahul Dass Thank you for pointing out my fault. I use above method as u suggested. But it have some pblms. There is some errors in create jar file. That related to JPEGImageEncoder,JPEGEncodeParam. – Möbius May 05 '14 at 07:53
  • @NikhilaKN can you attach the logfile or can you elaborate the error little bit more? – Rahul Dass May 05 '14 at 08:11
  • @ Rahul Dass Following errors get, when i build project error: package com.sun.image.codec.jpeg does not exist import com.sun.image.codec.jpeg.JPEGCodec; error: package com.sun.image.codec.jpeg does not exist import com.sun.image.codec.jpeg.JPEGEncodeParam; error: cannot find symbol JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(new FileOutputStream(outfile)); symbol: class JPEGImageEncoder error: cannot find symbol JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(new FileOutputStream(outfile)); symbol: variable JPEGCodec – Möbius May 05 '14 at 08:55
  • @NikhilaKN com.sun.image.codec.jpeg.JPEGCodec is a Sun proprietary API, you should not use it. I think you should read this thread https://www.java.net/node/662849 and reimplement using image I/O. – Rahul Dass May 05 '14 at 09:09
  • Ok. Thanku Rahul Dass :-) – Möbius May 05 '14 at 09:16
1

There is a similar question about resolution, answered in the following SO question here.

In general, you may be interested in learning image processing algorithms, which are described here:

The basic concept in decreasing resolution is that you are selectively deleting data from the image.

Community
  • 1
  • 1
Alex K.
  • 3,294
  • 4
  • 29
  • 41