Как рассчитать размер файла BufferedImage Java - PullRequest
13 голосов
/ 10 марта 2009

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

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

Все файлы пишутся в формате jpg, если это помогает при расчете размера.

Ответы [ 6 ]

18 голосов
/ 09 февраля 2011
    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();
13 голосов
/ 10 марта 2009

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

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

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

5 голосов
/ 10 марта 2009

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

3 голосов
/ 14 апреля 2017

Вы можете очень легко рассчитать размер 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);`
2 голосов
/ 11 марта 2009

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

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

1 голос
/ 21 марта 2015

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

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

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

...