Frage

Eine Anwendung Ich habe liest in ziemlich großen Bildern (JPEG-Dateien), sondern muss nur mit kleineren Bildern arbeiten, damit ich sie mit so etwas wie

unterabzutasten
ImageReadParam param = reader.getDefaultReadParam();
param.setSourceSubsampling(4, 4, 0, 0);
img = reader.read(0);

Aufgrund eines Fehlers in der JPEG-Leser, die nicht einige Meta-Daten umgehen kann, die ich auf andere Methoden zurückgreifen müssen, ein JAI wird mit dem Bild zu lesen und dann die Größe (Code unten ist, nicht muss ich verwenden Reflexion, da einige Implementierungsumgebungen nicht hat JAI zur Verfügung, ich weiß, dass ich, um dies besser entwickeln könnte, aber das ist, wie es ist).

try {
Class<?> c = ImageUtil.class.getClassLoader().loadClass("javax.media.jai.JAI");

if (c != null) { 
    URL url = new URL("file://" + file.getAbsolutePath());
    Method m = c.getMethod("create", String.class, Object.class);
    Object pi = m.invoke(null, "url", url);
    img = (BufferedImage) pi.getClass().getMethod("getAsBufferedImage").invoke(pi);
}
} catch (Throwable tt) {
// ...
}

Jedoch einige der Bilder wirklich groß sind hin und wieder ich aus der Erinnerung Ausnahmen zu bekommen, ist es trotzdem, ich JAI bekommen können das Bild unterabzutasten, wenn es i in der Art und Weise die Bilder lesen gelesen wird unter Verwendung eines Imagereader?

War es hilfreich?

Lösung

Ich gehe davon aus, die aus der Erinnerung Ausnahme wird ausgelöst, wenn Sie die Umstellung auf ein BufferedImage versuchen zu tun?

Wenn das der Fall ist, dann erwägen vielleicht auf die RenderedOp kleben, die von JAI create-Methode zurückgegeben wird und stattdessen eine ParameterBlock nutzen und weitere JAI schaffen das skalierte Bild zu erzeugen?

ParameterBlock paramBlock = new ParameterBlock();
paramBlock.addSource(((RenderedOp) pi).createInstance()); // Updated this
paramBlock.add(0.5f); // x Scale (Change these two Scale values!)
paramBlock.add(0.5f); // y Scale
paramBlock.add(0.0f); // x Translate
paramBlock.add(0.0f); // y Translate
paramBlock.add(new InterpolationBilinear()); // I think this Interpolation should work...)
RenderedOp resized = JAI.create("scale", paramBlock, null);

Der obige Code ist komplett ungetestet als Standard ich habe Angst, aber sollten Sie beginnen!

Sobald Sie haben das RenderedOp der Größe verändert, sollten Sie es sicher zu einem BufferedImage der Lage sein, zu konvertieren, wenn Sie müssen.

Andere Tipps

RenderedOp rop = JAI.create("fileload", file.getAbsolutePath());

ParameterBlock pb = new ParameterBlock();
pb.addSource(rop);
pb.add(0.5f);
pb.add(0.5f);
rop = JAI.create("scale", pb);

// For better looking results, but slower:
// rop = JAI.create("SubsampleAverage", pb);

BufferedImage bufImg = rop.getAsBufferedImage();   
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top