Как вычислить размер файла Java BufferedImage

У меня есть приложение на основе сервлета, которое обслуживает изображения из файлов, хранящихся локально. Я добавил логику, которая позволит приложению загружать файл изображения в BufferedImage, а затем изменять размер изображения, добавлять текст водяного знака поверх изображения или оба.

Я хотел бы установить длину содержимого перед написанием изображения. Помимо записи изображения во временный файл или массив байтов, есть ли способ найти размер BufferedImage?

все файлы записываются как jpg, если это помогает в вычислении размера.

6 ответов


нет, вы должны записать файл в память или во временный файл.

причина в том, что невозможно предсказать, как кодировка JPEG повлияет на размер файла.

кроме того, недостаточно "угадать" размер файла;Content-Length заголовок должен быть точечным.


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

Ну, BufferedImage не знает, что он записывается как JPEG - насколько это касается, это может быть PNG или GIF или TGA или TIFF или BMP... и все они имеют разные размеры файлов. Поэтому я не верю, что есть какой-либо способ для BufferedImage дать вам размер файла напрямую. Вам просто нужно записать его и сосчитать байты.


Если это не очень маленький файл изображения, предпочитайте использовать фрагментированную кодировку вместо указания длины содержимого.

в одном или двух последних подкастах stackoverflow было отмечено, что HTTP-прокси часто сообщают, что они поддерживают только HTTP/1.0, что может быть проблемой.


вы можете вычислить размер BufferedImage в памяти очень легко. Это потому, что это оболочка для WritableRaster, который использует DataBuffer для его поддержки. Если вы хотите рассчитать его размер в памяти, вы можете получить копию растра изображения с помощью getData (), а затем измерить размер буфера данных в растре.

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

перед загрузкой файла изображения в качестве BufferedImage сделайте ссылку на файл изображения через объект File.

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

imgLength будет вашим приблизительным размером изображения, хотя он меняется после изменения размера, а затем любых операций, которые вы выполняете на нем.