hi. Ich hab ein kleines Performenceproblem.
Ich will ein tiff von der Festplatte laden, skalieren und dann in ein byte array schreiben. Das Problem ist nur, dass das Schreiben des byte arrays extrem lange dauert.
Ich mach das bis jetzt mit der der java advanced image (JAI) api, hier mal ein code ausschnitt:
die methode zum erzeugen des PlanarImage/RenderedImage:
und dann die methode um daraus ein byte array zu machen:
Bin auch gerne für andere Möglichkeiten offen, es muss nicht über die JAI erfolgen.
MFG Markus
Ich will ein tiff von der Festplatte laden, skalieren und dann in ein byte array schreiben. Das Problem ist nur, dass das Schreiben des byte arrays extrem lange dauert.
Ich mach das bis jetzt mit der der java advanced image (JAI) api, hier mal ein code ausschnitt:
die methode zum erzeugen des PlanarImage/RenderedImage:
Code:
public PlanarImage getRenderedImage(String path, int x, int y) {
ParameterBlock pb = new ParameterBlock();
PlanarImage pi = null;
float factor = 1;
int bildXgroesse = 0;
int bildYgroesse = 0;
if (new File(path).exists()) {
pi = JAI.create("fileload", path);
bildYgroesse = pi.getHeight();
bildXgroesse = pi.getWidth();
while (bildXgroesse > x || bildYgroesse > y) {
if (bildXgroesse > x && bildYgroesse > y) {
if (bildXgroesse >= bildYgroesse) {
factor = this.getFactor(bildXgroesse, bildYgroesse, x);
} else {
factor = this.getFactor(bildXgroesse, bildYgroesse, y);
}
} else if (bildXgroesse <= x && bildYgroesse > y) {
factor = this.getFactor(bildXgroesse, bildYgroesse, y);
} else if (bildXgroesse > x && bildYgroesse <= y) {
factor = this.getFactor(bildXgroesse, bildYgroesse, x);
}
bildXgroesse = (int) (bildXgroesse * factor);
bildYgroesse = (int) (bildYgroesse * factor);
}
if (factor != 1) {
pb.addSource(pi);
pb.add(factor);
pb.add(factor);
pi = JAI.create("scale", pb);
}
}
return pi;
}
und dann die methode um daraus ein byte array zu machen:
Code:
public byte[] getByteArray(PlanarImage pi) {
ByteArrayOutputStream bouts = new ByteArrayOutputStream();
JAI.create("encode", pi, bouts, "JPEG");
return bouts.toByteArray();
}
Bin auch gerne für andere Möglichkeiten offen, es muss nicht über die JAI erfolgen.
MFG Markus