H
HugeBob
Good Morning All,
I'm a CF developer and I've been tasked to come up with a way to
upload images (JPG, PNG and GIF) and resize them while maintaining the
original aspect ratio for the resized image. I was able to find and
modify some sample code that handled the resizing for JPEG's. But, I
have to do this for the other formats as well. Here's the sample code
snippet for JPEG's:
import com.sun.image.codec.jpeg.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
public class Thumbnail {
..
..
..
public myResizeMethod(String inputFile, String outputFile, int
thumbWidth, int thumbHeight, int qualitySpec) throws Exception {
Image image = Toolkit.getDefaultToolkit().getImage(inputFile);
MediaTracker mediaTracker = new MediaTracker(new Container());
mediaTracker.addImage(image, 0);
mediaTracker.waitForID(0);
double thumbRatio = (double)thumbWidth / (double)thumbHeight;
int imageWidth = image.getWidth(null);
int imageHeight = image.getHeight(null);
double imageRatio = (double)imageWidth / (double)imageHeight;
if (thumbRatio < imageRatio) {
thumbHeight = (int)(thumbWidth / imageRatio);
} else {
thumbWidth = (int)(thumbHeight * imageRatio);
}
// draw original image to thumbnail image object and
// scale it to the new size on-the-fly
BufferedImage thumbImage = new BufferedImage(thumbWidth,
thumbHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = thumbImage.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);
// save thumbnail image to OUTFILE
BufferedOutputStream out = new BufferedOutputStream(new
FileOutputStream(outputFile));
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param =
encoder.getDefaultJPEGEncodeParam(thumbImage);
int quality = Math.max(0, Math.min(qualitySpec, 100));
param.setQuality((float)quality / 100.0f, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(thumbImage);
out.close();
}
}
Now, not knowing much about the internal workings of images, can I use
a similar algorithm for PNG's and GIF's? I was hoping there was a
similar set of encoders/decoder classes for them. But, I haven't been
able to find any.
I'm a CF developer and I've been tasked to come up with a way to
upload images (JPG, PNG and GIF) and resize them while maintaining the
original aspect ratio for the resized image. I was able to find and
modify some sample code that handled the resizing for JPEG's. But, I
have to do this for the other formats as well. Here's the sample code
snippet for JPEG's:
import com.sun.image.codec.jpeg.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
public class Thumbnail {
..
..
..
public myResizeMethod(String inputFile, String outputFile, int
thumbWidth, int thumbHeight, int qualitySpec) throws Exception {
Image image = Toolkit.getDefaultToolkit().getImage(inputFile);
MediaTracker mediaTracker = new MediaTracker(new Container());
mediaTracker.addImage(image, 0);
mediaTracker.waitForID(0);
double thumbRatio = (double)thumbWidth / (double)thumbHeight;
int imageWidth = image.getWidth(null);
int imageHeight = image.getHeight(null);
double imageRatio = (double)imageWidth / (double)imageHeight;
if (thumbRatio < imageRatio) {
thumbHeight = (int)(thumbWidth / imageRatio);
} else {
thumbWidth = (int)(thumbHeight * imageRatio);
}
// draw original image to thumbnail image object and
// scale it to the new size on-the-fly
BufferedImage thumbImage = new BufferedImage(thumbWidth,
thumbHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = thumbImage.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);
// save thumbnail image to OUTFILE
BufferedOutputStream out = new BufferedOutputStream(new
FileOutputStream(outputFile));
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param =
encoder.getDefaultJPEGEncodeParam(thumbImage);
int quality = Math.max(0, Math.min(qualitySpec, 100));
param.setQuality((float)quality / 100.0f, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(thumbImage);
out.close();
}
}
Now, not knowing much about the internal workings of images, can I use
a similar algorithm for PNG's and GIF's? I was hoping there was a
similar set of encoders/decoder classes for them. But, I haven't been
able to find any.