[QUOTE=mymaksimus]Aeh sry ich war grad verwirrt.
Also get scaled instance nicht benutzen?
Ich meinte natuerlich das man get scaled instance nur einmal aufruft; und dann gar keine groessen parameter benoetigt[/QUOTE]“Nicht benötigt” ist gut btw ;). Zumindest nicht beim “drawImage()”-Aufruf, aber genau dort sollte man sie verwenden.
Ist alles eine Frage des Speicherverbrauchs. “getScaledInstance()” liefert stets ein Image mit neu reserviertem Speicherbereich, jedoch ohne Garantie, dass das Original auch gleich in diesen hineinkopiert wurde (erkennt man daran, dass die Breiten- und Höhenangaben des Images negative Werte liefern). Ein “drawImage()” mir Grössenangaben hingegen zeichnet das Image gescaled in den Graphics-Context und dass ohne dabei neuer Speicher reserviert wird. Nimmt man nun noch den Umstand hinzu, das "java.awt.Image"es alles andere als verlässlich zu handhaben sind, haben Methoden, die ein solches liefern durch die Bank bis auf @Deprecated eigentlich gar keine Existenzberechtigung mehr, weil man bei BufferedImages die bessere Kontrolle hat. Ein Image scaled man (wenns denn sein muß) also besser so:
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ImageConsumer;
import java.awt.image.ImageProducer;
import java.awt.image.WritableRaster;
import java.util.Hashtable;
public final class ImageUtils {
private ImageUtils() {
// nothing
}
public static BufferedImage waitForLoad(Image img) {
if(img instanceof BufferedImage) {
return (BufferedImage) img;
}
ImageProducer producer = img.getSource();
final BufferedImage[] rc = new BufferedImage[1];
ImageConsumer consumer = new ImageConsumer() {
private Hashtable<?, ?> props;
private ColorModel model;
private WritableRaster raster;
private int width, height;
boolean err = true;
@Override
public void setProperties(Hashtable<?, ?> props) {
this.props = props;
}
@Override
public void setPixels(int x, int y, int w, int h, ColorModel model,
int[] pixels, int off, int scansize) {
if(this.model == null) {
this.model = model;
}
if(this.model != model) {
err = true;
}
raster = model.createCompatibleWritableRaster(width, height);
raster.setDataElements(x, y, w, h, pixels);
}
@Override
public void setPixels(int x, int y, int w, int h, ColorModel model,
byte[] pixels, int off, int scansize) {
if(this.model == null) {
this.model = model;
}
if(this.model != model) {
err = true;
}
raster = model.createCompatibleWritableRaster(width, height);
raster.setDataElements(x, y, w, h, pixels);
}
@Override
public void setHints(int hintflags) {
}
@Override
public void setDimensions(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public void setColorModel(ColorModel model) {
this.model = model;
}
@Override
public void imageComplete(int status) {
if(status == SINGLEFRAMEDONE || status == STATICIMAGEDONE && !err) {
rc[0] = new BufferedImage(model, raster, model.isAlphaPremultiplied(), props);
}
synchronized (this) {
notifyAll();
}
}
};
producer.startProduction(consumer);
synchronized(consumer) {
try {
consumer.wait();
} catch(InterruptedException e) {
// tja
}
}
return rc[0];
}
public static BufferedImage scale(Image src, int width, int height) {
if(width <= 0 || height <= 0) {
throw new IllegalArgumentException("invalid width or height");
}
BufferedImage tmp = waitForLoad(src);
if(width == tmp.getWidth() && height == tmp.getHeight()) {
return tmp;
}
ColorModel cm = tmp.getColorModel();
WritableRaster wr = cm.createCompatibleWritableRaster(width, height);
BufferedImage rc = new BufferedImage(cm, wr, cm.isAlphaPremultiplied(), null);
Graphics g2d = rc.createGraphics();
g2d.drawImage(tmp, 0, 0, width, height, null);
g2d.dispose();
return rc;
}
}```
edit: Bei der waitForLoad-Methode bin ich mir im Übrigen gar nicht so sicher, ob das die zuletzt funktionierende war... Da hatte ich mal arg viele Probleme bei den beiden "setPixel()"-Methoden des ImageConsumers. Wenn diese Methode nicht immer funktioniert, bitte melden... Die letzte Version ist gemeinsam mit 'ner Festplatte leider vor einiger Zeit in den Hades gegangen.