Frage

Ich habe eine Servlet-basierte Anwendung, die gespeicherten Bilder von Dateien lokal bedient. Ich habe Logik hinzugefügt, dass die Anwendung ermöglicht die Image-Datei auf eine BufferedImage zu laden und dann die Größe des Bildes, Wasserzeichen Text über die Oberseite des Bildes hinzufügen, oder beides.

Ich möchte die Inhaltslänge einzustellen, bevor das Bild auszuschreiben. Abgesehen vom Schreiben des Bildes in einer temporären Datei oder Byte-Array, ist es eine Möglichkeit, die Größe des BufferedImage zu finden?

Alle Dateien werden als jpg geschrieben, wenn diese bei der Berechnung der Größe hilft.

War es hilfreich?

Lösung

Nein, müssen Sie die Datei im Speicher oder in eine temporäre Datei schreiben.

Der Grund dafür ist, dass es unmöglich ist, vorherzusagen, wie die JPEG-Kodierung Dateigröße auswirken wird.

Außerdem ist es nicht gut genug, um in der Dateigröße „zu erraten“; der Content-Length Header hat Spot-on sein.

Andere Tipps

    BufferedImage img = = new BufferedImage(500, 300, BufferedImage.TYPE_INT_RGB);

    ByteArrayOutputStream tmp = new ByteArrayOutputStream();
    ImageIO.write(img, "png", tmp);
    tmp.close();
    Integer contentLength = tmp.size();

    response.setContentType("image/png");
    response.setHeader("Content-Length",contentLength.toString());
    OutputStream out = response.getOutputStream();
    out.write(tmp.toByteArray());
    out.close();

Nun, die BufferedImage weiß nicht, dass es als JPEG geschrieben werden - soweit sie betroffen ist, könnte es PNG oder GIF oder TGA oder TIFF oder BMP sein ... und alle die, haben unterschiedliche Dateigrößen. Also ich glaube nicht, dass es eine Möglichkeit für die BufferedImage Sie direkt eine Dateigröße zu geben. Sie müssen nur um es zu schreiben und die Bytes zählen.

Sie können sehr leicht die Größe eines BufferedImage im Speicher berechnen. Dies ist, weil es ein Wrapper für eine WritableRaster ist, die eine Databuffer für seine Unterstützung verwendet. Wenn Sie berechnen möchten ist es Größe im Speicher eine Kopie des Rasters Bild bekommen kann mit getData () und dann in das Raster der Größe des Datenpuffers zu messen.

DataBuffer dataBuffer = bufImg.getData().getDataBuffer();

// Each bank element in the data buffer is a 32-bit integer
long sizeBytes = ((long) dataBuffer.getSize()) * 4l;
long sizeMB = sizeBytes / (1024l * 1024l);`

Es sei denn, es ist eine sehr kleine Bilddatei ist, bevorzugen aufgeteilte Codierung zu verwenden, um über eine Inhaltslänge angeben.

Es wurde in einem oder zwei aktuellen Podcasts Stackoverflow festgestellt, dass die HTTP-Proxies oft berichten, dass sie nur die HTTP-Unterstützung / 1.0, das ein Problem sein kann.

Bevor Sie die Bilddatei als BufferedImage laden einen Verweis auf die Bilddatei über das File-Objekt machen.

File imgObj = new File("your Image file path");
int imgLength = (int) imgObj.length();

imgLength würde Ihre ungefähre Bildgröße sein, obwohl es nach dem Ändern der Größe und dann alle Vorgänge variieren meine Sie darauf ausführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top