Java: Erkennen von Bild-format, Größe ändern (skalieren) und als JPEG speichern
Dies ist der code, den ich habe, es tatsächlich funktioniert, nicht perfekt, aber es funktioniert, das problem ist, dass die verkleinerten Vorschaubilder werden nicht einfügen, die auf das weiße Rechteck Gezeichnet, brechen die Bilder Seitenverhältnis, hier ist der code, kann jemand mir empfehlen eine Lösung für Sie, bitte?
Danke
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ImageScalerImageIoImpl implements ImageScaler {
private static final String OUTPUT_FORMAT_ID = "jpeg";
//Re-scaling image
public byte[] scaleImage(byte[] originalImage, int targetWidth,
int targetHeight) {
try {
InputStream imageStream = new BufferedInputStream(
new ByteArrayInputStream(originalImage));
Image image = (Image) ImageIO.read(imageStream);
int thumbWidth = targetWidth;
int thumbHeight = targetHeight;
//Make sure the aspect ratio is maintained, so the image is not skewed
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 the scaled image
BufferedImage thumbImage = new BufferedImage(thumbWidth,
thumbHeight, BufferedImage.TYPE_INT_RGB);
System.out.println("Thumb width Buffered: " + thumbWidth + " || Thumb height Buffered: " + thumbHeight);
Graphics2D graphics2D = thumbImage.createGraphics();
//Use of BILNEAR filtering to enable smooth scaling
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
//graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);
//White Background
graphics2D.setPaint(Color.WHITE);
graphics2D.fill(new Rectangle2D.Double(0, 0, targetWidth,
targetHeight));
graphics2D.fillRect(0, 0, targetWidth, targetHeight);
System.out.println("Target width: " + targetWidth + " || Target height: " + targetHeight);
//insert the resized thumbnail between X and Y of the image
graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);
System.out.println("Thumb width: " + thumbWidth + " || Thumb height: " + thumbHeight);
//Write the scaled image to the outputstream
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(thumbImage, OUTPUT_FORMAT_ID, out);
return out.toByteArray();
} catch (IOException ioe) {
throw new ImageResizingException(ioe);
}
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie ganz einfach skalieren Sie Ihr Bild mit
Image
'sgetScaledInstance
Methode:Sobald Sie im Besitz Ihres skaliert
Image
können Sie "konvertieren" zurück in eineBufferedImage
wie beschrieben hier.Schließlich verwenden die
ImageIO
Klasse zu schreiben, IhreBufferedImage
zu einer Datei.