2009-03-10 40 views
10

Tôi có một ứng dụng dựa trên servlet phục vụ hình ảnh từ các tệp được lưu trữ cục bộ. Tôi đã thêm logic cho phép ứng dụng tải tệp hình ảnh vào BufferedImage và sau đó thay đổi kích thước hình ảnh, thêm văn bản mờ trên đầu hình ảnh hoặc cả hai.Làm thế nào để tính toán java BufferedImage filesize

Tôi muốn đặt độ dài nội dung trước khi viết hình ảnh. Ngoài việc viết hình ảnh vào một tệp tạm thời hoặc mảng byte, có cách nào để tìm kích thước của BufferedImage không?

Tất cả các tệp đang được viết dưới dạng jpg nếu điều đó giúp tính toán kích thước.

Trả lời

12

Không, bạn phải ghi tệp trong bộ nhớ hoặc vào tệp tạm thời.

Lý do là không thể dự đoán cách mã hóa JPEG sẽ ảnh hưởng đến kích thước tệp.

Ngoài ra, không đủ để "đoán" ở kích thước tệp; tiêu đề Content-Length phải được đặt tại chỗ.

5

Vâng, BufferedImage không biết rằng nó được viết dưới dạng JPEG - như nó liên quan, nó có thể là PNG hoặc GIF hoặc TGA hoặc TIFF hoặc BMP ... và tất cả đều có kích thước tệp khác nhau. Vì vậy, tôi không tin rằng có bất kỳ cách nào cho BufferedImage để cung cấp cho bạn một kích thước tập tin trực tiếp. Bạn sẽ phải viết nó ra và đếm các byte.

2

Trừ khi đó là tệp hình ảnh rất nhỏ, thích sử dụng mã hóa chunked hơn chỉ định độ dài nội dung.

Điều này đã được ghi nhận trong một hoặc hai podcast tràn bộ đệm gần đây mà proxy HTTP thường báo cáo rằng chúng chỉ hỗ trợ HTTP/1.0, đây có thể là một vấn đề.

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

Trước khi bạn tải tệp hình ảnh dưới dạng BufferedImage, hãy tham chiếu đến tệp hình ảnh qua đối tượng Tệp.

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

imgLength sẽ là kích thước hình ảnh gần đúng của bạn mặc dù nó my khác nhau sau khi thay đổi kích thước và sau đó bất kỳ hoạt động bạn thực hiện trên nó.

1

Bạn có thể tính toán kích thước của BufferedImage trong bộ nhớ rất dễ dàng. Điều này là bởi vì nó là một wrapper cho một WritableRaster sử dụng một DataBuffer cho nó sao lưu. Nếu bạn muốn tính toán kích thước của nó trong bộ nhớ, bạn có thể lấy một bản sao của raster của hình ảnh bằng cách sử dụng getData() và sau đó đo kích thước của bộ đệm dữ liệu trong 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);` 
Các vấn đề liên quan