My instructor sent me this code, which is supposed to be an integral part of an ongoing project. Thing is, it doesn’t work.
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.Kernel; import java.awt.image.ConvolveOp; import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import javax.swing.*; public class ImageUtil { public static void resize(File originalFile, File resizedFile, int newWidth, float quality) throws IOException{ if(quality <0||quality>1){ throw new IllegalArgumentException ('quality has to be between 0 and 1'); } ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath()); Image i = ii.getImage(); Image resizedImage = null; int iWidth = i.getWidth (null); int iHeight = i.getHeight(null); if (iWidth > iHeight){ resizedImage = i.getScaledInstance(newWidth,(newWidth*iHeight)/iWidth, Image.SCALE_SMOOTH); } else { resizedImage = i.getScaledInstance((newWidth*iWidth)/iHeight,newWidth, Image.SCALE_SMOOTH); } Image temp = new ImageIcon (resizedImage).getImage(); BufferedImage bufferedImage = new BufferedImage (temp.getWidth(null), temp.getHeight(null), BufferedImage.TYPE_INT_RGB); // copy to a buffered image Graphics g = bufferedImage.createGraphics(); g.setColor(Color.white); g.fillRect(0,0,temp.getWidth(null), temp.getHeight(null)); // causea el error de ejecución? g.drawImage(temp,0,0,null); g.dispose(); float softenFactor = 0.05f; float [] softenArray = {0, softenFactor,0, softenFactor, 1-(softenFactor*4), softenFactor,0, softenFactor,0}; Kernel kernel = new Kernel (3,3,softenArray); ConvolveOp cOp = new ConvolveOp (kernel, ConvolveOp.EDGE_NO_OP,null); bufferedImage = cOp.filter (bufferedImage,null); FileOutputStream out = new FileOutputStream(resizedFile); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage); param.setQuality(quality,true); encoder.setJPEGEncodeParam(param); encoder.encode(bufferedImage); } public static void main(String args[]) throws IOException { File originalImage= new File ('/images/goya.jpg'); resize(originalImage,new File('/images/goyanuevotamanio.jpg'),350, 0.2f); resize(originalImage, new File('/images/goyanuevotamanio.jpg'), 350, 1f); } }
He says the code should be able to resize both height and width yet his resize method:
public static void resize(File originalFile, File resizedFile, int newWidth, float quality)
lacks a newHeight parameter.
The RuntimeException that’s thrown says:
Exception in thread 'main' java.lang.IllegalArgumentException: **Width (-1) and height (-1) cannot be <= 0** at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:999) at java.awt.image.BufferedImage.<init>(BufferedImage.java:312) at ImageUtil.resize(ImageUtil.java:38) at ImageUtil.main(ImageUtil.java:72) Java Result: 1
How can I change this?
Without analyzing the code to see what the problem might be, I can say that if the intention is to keep the images aspect ratio, a new height parameter is not needed. It will always be a fixed ratio of the width.
UPDATE:
I’ve run the code against my own test image and it does indeed work as expected. The error you are getting is most likely caused when the program cannot find the source image you specify. I get the same error when I specify a source image that doesn’t exist.
Try using an absolute path (including drive letter etc.) for your source image.
UPDATE 2
Add the following code after the line..
This will tell you if the program is failing to load the source image.