Come calcolare la dimensione del file java BufferedImage
-
08-07-2019 - |
Domanda
Ho un'applicazione basata su servlet che serve immagini da file memorizzati localmente. Ho aggiunto una logica che consentirà all'applicazione di caricare il file di immagine in un'immagine bufferizzata e quindi di ridimensionare l'immagine, aggiungere il testo della filigrana sopra l'immagine o entrambi.
Vorrei impostare la lunghezza del contenuto prima di scrivere l'immagine. Oltre a scrivere l'immagine in un file temporaneo o in una matrice di byte, esiste un modo per trovare la dimensione di BufferedImage?
Tutti i file vengono scritti come jpg se questo aiuta a calcolare la dimensione.
Soluzione
No, è necessario scrivere il file in memoria o in un file temporaneo.
Il motivo è che è impossibile prevedere in che modo la codifica JPEG influirà sulla dimensione del file.
Inoltre, non è abbastanza buono per " indovinare " alla dimensione del file; l'intestazione Content-Length
deve essere precisa.
Altri suggerimenti
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();
Bene, BufferedImage non sa che è stato scritto come JPEG - per quanto riguarda, potrebbe essere PNG o GIF o TGA o TIFF o BMP ... e tutti hanno file di dimensioni diverse. Quindi non credo ci sia modo per BufferedImage di darti direttamente una dimensione del file. Dovrai solo scriverlo e contare i byte.
È possibile calcolare la dimensione di un'immagine bufferizzata in memoria molto facilmente. Questo perché è un wrapper per WritableRaster che utilizza un DataBuffer per il suo supporto. Se vuoi calcolare la sua dimensione in memoria puoi ottenere una copia del raster dell'immagine usando getData () e quindi misurare la dimensione del buffer di dati nel raster.
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);`
A meno che non si tratti di un file di immagine molto piccolo, preferisci utilizzare la codifica a blocchi piuttosto che specificare una lunghezza del contenuto.
È stato notato in uno o due recenti podcast stackoverflow che i proxy HTTP spesso segnalano che supportano solo HTTP / 1.0, il che potrebbe essere un problema.
Prima di caricare il file immagine come BufferedImage, fai un riferimento al file immagine tramite l'oggetto File.
File imgObj = new File("your Image file path");
int imgLength = (int) imgObj.length();
imgLength sarebbe la dimensione approssimativa dell'immagine anche se può variare dopo il ridimensionamento e quindi qualsiasi operazione eseguita su di essa.