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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top