title image


Smiley JpegImageEncoder - Fehlermeldung
Hallo!



Ich habe wieder mal ein Problemchen, bei dem ich etwas Hilfe bräuchte. Ich will ein Jpeg einlesen, verkleinern und das Resultat an eine andere Methode übergeben, die einen Input-Stream erwartet. Ich habe mir dazu versuchsweise eine statische Methode geschrieben, allerdings meldet mir die encode-Methode "reading encoded JPEG stream" (eine IOException). Ich poste mal den Code, evtl. seht ihr das Problem auf Anhieb, für mich ist das Neuland, das ist auch diversen Beispielen zusammengeschnitten habe.





static InputStream scaleImage(final BufferedImage img, final int maxWidth,

final int maxHeight, final float quality,

final boolean forceBaseline) throws IOException {

final double maxRatio = maxWidth / maxHeight;

final double srcHeight = img.getHeight();

final double srcWidth = img.getWidth();

final double srcRatio = srcWidth / srcHeight;

final double scaleFactor;

if (srcRatio < maxRatio) {

scaleFactor = maxHeight / srcHeight;

} else {

scaleFactor = maxWidth / srcWidth;

}

final int dstHeight = (int) (srcHeight * scaleFactor);

final int dstWidth = (int) (srcWidth * scaleFactor);

final BufferedImage dest = new BufferedImage(dstWidth, dstHeight,

BufferedImage.TYPE_INT_RGB);

dest.createGraphics().drawRenderedImage(img,

AffineTransform.getScaleInstance(scaleFactor, scaleFactor));

final PipedOutputStream outStream = new PipedOutputStream();

final JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);

final JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(dest);

param.setQuality(quality, forceBaseline);

encoder.encode(dest, param);

return new PipedInputStream(outStream);

}





Nachtrag: habe gerade festgestellt, dass der Versuch mit PipedInput- bzw PipedOutputStream so auch nicht funkioniert. Gibts da irgendeine Möglichkeit, die Daten im Speicher zwischenzuparken und via InputStream wieder auszulesen - die Methode aus einer Library, die ich verwende erwartet als Datenquelle einen InputStream!

Bitte helft mir!



2. Nachtrag: Dieser Code hier funkioniert, aber leider kann ich da den gewünschten Kompressionsgrad nicht angeben - oder? Wie bekomme ich das Problem in den Griff und welche Kompressionsstärke wird hier benutzt?

static InputStream scaleImage(final BufferedImage img, final int maxWidth,

final int maxHeight, final float quality,

final boolean forceBaseline) throws IOException {

final double maxRatio = maxWidth / maxHeight;

final double srcHeight = img.getHeight();

final double srcWidth = img.getWidth();

final double srcRatio = srcWidth / srcHeight;

final double scaleFactor;

if (srcRatio < maxRatio) {

scaleFactor = maxHeight / srcHeight;

} else {

scaleFactor = maxWidth / srcWidth;

}

final int dstHeight = (int) (srcHeight * scaleFactor);

final int dstWidth = (int) (srcWidth * scaleFactor);

final BufferedImage dest = new BufferedImage(dstWidth, dstHeight,

BufferedImage.TYPE_INT_RGB);

dest.createGraphics().drawRenderedImage(img,

AffineTransform.getScaleInstance(scaleFactor, scaleFactor));

final ByteArrayOutputStream outStream = new ByteArrayOutputStream(100 * 1024);

//final JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);

//final JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(dest);

//param.setQuality(quality, forceBaseline);

//encoder.encode(dest, param);

ImageIO.write(dest, "JPG", outStream);

return new ByteArrayInputStream(outStream.toByteArray());

}





geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: