how can i convert a java.awt.image to inputstream

P_H_I_L

Erfahrenes Mitglied
Hallo Leute,
bin am verzweifeln.ich suche eine funktion, bei der ich ein image zu einem bestimmten faktor verkleinern kann. einen reszize durchführen,

Und wie bekomme ich aus dem Image einen InputStream?

Kann mir jemand helfen?


Lg,
Phil
 
Kann ich daraus einen inputstream generieren:
HTML:
 java.awt.Image scaledImage = image.getScaledInstance(iw, ih, Image.SCALE_SMOOTH);

Dies ergibt Null.... Wieso? Kann jemand helfen
HTML:
ImageInputStream iis = ImageIO.createImageInputStream(scaledImage);
 
getScaledInstance ist böse (dazu gibt es im Internet genügend Beiträge).
Sofern du anstelle des Image auch ein BufferedImage nehmen kannst, hier ein Lösungsansatz:
Erstelle ein neues Bild mit den gewünschten Abmessungen und zeichne mit Hilfe von java.awt.Graphics2d das alte Bild in das neue.
Java:
int newWidth=100, newHeight=100;        
BufferedImage scaledImage = new BufferedImage(newWidth,newHeight,BufferedImage.TYPE_INT_RGB);
Graphics2D g = scaledImage.createGraphics();
g.drawImage(originalImage, 0, 0, newWidth, newHeight, null);
g.dispose();

Wozu brauchst du denn den InputStream? So bekommst du das BufferedImage in ein OutputStream bzw. ByteArrayOutputStream, vielleicht hilft dir das irgendwie weiter.
Java:
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
ImageIO.write(scaledImage, "jpg", outStream);
 
ja dies funktioniert. Aber die bilder schauen schlecht aus. verlieren sehr an qualität.
Außerdem brauch ich es als inputstream, weil ich den inputstream dann via upload auf meinen Server laden will.

Gibt es nichts fertiges, das JPEG Bilder (gerne auch andere Formate) sauber Resized, das verhältnis soll dabei gleich bleiben. Anschließend soll inputstream rauskomen, das ich es auf den Server kopieren kann.

Gibts da schon was fertiges, finde nichts. Gibts den was besseres als dieses graphics2? Oder mach ich einfach was falsch

Lg,
Phil
 
Ich nutze im produktiven Einsatz folgendes:
Java:
Graphics2D g = image.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);

Damit hast du schonmal eine Steuerung der Qualität. Wenn du jetzt aber sehr große Bilder verkleinerst (z.B. 10Megapixel nach 800*600), bekommst du hässliche Treppenstufen. Deshalb solltest du das Bild nicht auf einmal verkleinern, sondern Schrittweise. Bei mir hat sich 75% als Kompromiss zwischen Qualität und Performance bewährt. Du verkleinerst also das Bild mehrfach um 75%, bis du bei der gewünschten Größe angekommen bist und machst beim letzten Schritt dann keine 75%, sondern verkleinerst es auf die Zielgröße.

Zum Server Übertrage ich es als byte[]. Mit folgender Methode kann man außerdem die jpeg-Kompression bestimmen (ich nutze 95%, da es im Vergleich zu 100% noch sehr gut aussieht, aber wesentlich kleiner ist.)
Java:
private final float JPEG_QUALITY = 0.95f;

...

public byte[] getBytes()
    throws Exception
{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);

param.setQuality(JPEG_QUALITY, true);
encoder.setJPEGEncodeParam(param);

encoder.encode(image);

return outStream.toByteArray();
}
 
ja hat soweit ganz gut funktioniert. aber habe qualitätsverlust mit diesen graphics 2d....

Aber soweit so gut. Jetzt fürn Anfang nicht so schlimm.
 
Zurück