2009-03-10 9 views
10

Tengo una aplicación basada en servlet que está publicando imágenes desde archivos almacenados localmente. He agregado una lógica que permitirá a la aplicación cargar el archivo de imagen en una Imagen Buffered y luego cambiar el tamaño de la imagen, agregar texto de marca de agua en la parte superior de la imagen, o ambos.Cómo calcular el tamaño del archivo BufferedImage java

Me gustaría establecer la duración del contenido antes de escribir la imagen. Además de escribir la imagen en un archivo temporal o matriz de bytes, ¿hay alguna forma de encontrar el tamaño de la imagen almacenada?

Todos los archivos se escriben como jpg si eso ayuda a calcular el tamaño.

Respuesta

12

No, debe escribir el archivo en la memoria o en un archivo temporal.

La razón es que es imposible predecir cómo la codificación JPEG afectará el tamaño del archivo.

Además, no es lo suficientemente bueno para "adivinar" el tamaño del archivo; el encabezado Content-Length tiene que ser de localización directa.

5

Bueno, el BufferedImage no sabe que se está escribiendo como JPEG, en lo que a él respecta, podría ser PNG o GIF o TGA o TIFF o BMP ... y todos tienen diferentes tamaños de archivo. Así que no creo que haya ninguna forma de que BufferedImage le proporcione un tamaño de archivo directamente. Tendrás que escribirlo y contar los bytes.

2

A menos que sea un archivo de imagen muy pequeño, prefiera utilizar la codificación fragmentada antes que especificar una longitud de contenido.

Se observó en uno o dos podcasts de stackoverflow recientes que los proxies HTTP a menudo informan que solo son compatibles con HTTP/1.0, lo que puede ser un problema.

16
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(); 
0

Antes de cargar el archivo de imagen como Imagen Buffered haga una referencia al archivo de imagen mediante el objeto Archivo.

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

imgLength sería el tamaño de la imagen aproximada a pesar de que mis varían después de cambiar el tamaño y las operaciones que se realizan en él.

1

Puede calcular el tamaño de una Imagen Buffered en la memoria muy fácilmente. Esto se debe a que es un contenedor para un WritableRaster que usa un DataBuffer para su respaldo. Si desea calcular su tamaño en la memoria, puede obtener una copia del ráster de la imagen utilizando getData() y luego medir el tamaño del búfer de datos en el ráster.

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);` 
Cuestiones relacionadas