Thomas Bendsen wrote:
>
> Er der nogen som kan hjælpe med en algoritme til at foretage en pænere
> skalering, eller som kan henvise til et godt sted at læse mere om emnet.
> Der er tale om JPEG-billeder.
>
Hej
Jeg har selv samme problem og tror snart jeg har været hele nettet
igennem for at finde en metode der virker og samtidig ikke er langsom.
Det eneste jeg er kommet frem til som virker er nedenstående, men det
performer desværre ikke specielt godt. Håber du kan bruge det.
/**
* Scale JPEG image. This method is ugly and slow as hell!
* @param width Width in pixel og new image.
* @param file File to scale.
* @return byte[] with scaled image.
*/
public byte[] createJPEG(int width, File file) throws ScaleException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byte[] newImage;
try {
ImageIcon ii = new ImageIcon(file.getCanonicalPath());
Image i = ii.getImage();
Image resizedImage = null;
int iWidth = i.getWidth(null);
int iHeight = i.getHeight(null);
double scale = (double) iHeight / iWidth;
int newHeight = 0;
if (width == -1) {
newHeight = i.getHeight(null);
width = i.getWidth(null);
}
else {
newHeight = (int) (scale * width);
}
resizedImage = i.getScaledInstance(width, newHeight,
Image.SCALE_SMOOTH);
// This code ensures that all the
// pixels in the image are loaded.
Image temp = new ImageIcon(resizedImage).getImage();
// Create the buffered image.
BufferedImage bufferedImage = new
BufferedImage(temp.getWidth(null), temp.getHeight(null),
BufferedImage.TYPE_INT_RGB);
// Copy image to buffered image.
Graphics g = bufferedImage.createGraphics();
// Clear background and paint the image.
g.setColor(Color.white);
g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
g.drawImage(temp, 0, 0, null);
g.dispose();
// encodes image as a JPEG data stream
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(byteStream);
com.sun.image.codec.jpeg.JPEGEncodeParam param =
encoder.getDefaultJPEGEncodeParam(bufferedImage);
// writeParam = new JPEGImageWriteParam(null);
// writeParam.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
//writeParam.setProgressiveMode(JPEGImageWriteParam.MODE_DEFAULT);
param.setQuality(0.75F, true);
encoder.setJPEGEncodeParam(param);
encoder.encode(bufferedImage);
byteStream.flush();
newImage = byteStream.toByteArray();
byteStream.close();
return(newImage);
}
catch (IOException e) {
throw new ScaleException(e);
}
catch(Exception e) {
throw new ScaleException();
}
}
--
Jonas Pedersen - jonas(a)chown.dk
http://chown.dk &
http://pictureshow.dk
Nyheder på din windows desktop?
http://rss.chown.dk