2010-08-31 7 views
5

Tôi đang viết một ứng dụng web cho phép người dùng tải lên hình ảnh ở nhiều định dạng (ví dụ: png, jpg, bmp). Sau khi hình ảnh được tải lên, hệ thống sẽ chuyển đổi nó thành "png" và mở rộng nó thành độ phân giải được xác định trước.Java chuyển đổi định dạng hình ảnh có dấu chân bộ nhớ thấp

Để chuyển đổi các hình ảnh tôi sử dụng phương pháp tiện dụng:

javax.imageio.ImageIO.write(im, type, baos); 

Đây là nơi mà vấn đề bắt đầu. Đối số đầu tiên của Image javax.imageio.ImageIO.write là RenderedImage. Tài liệu Java nói rằng việc thực hiện chỉ được biết là BufferedImage.

Tôi cố gắng tìm cách chuyển đổi java.awt.Image thành BufferedImage, nhưng dường như không thể. Tuy nhiên, có thể draw an image on a BufferedImage.

Vấn đề là tạo ra một BufferedImage mới mỗi lần là rất tốn kém bộ nhớ. Tôi có thể bắt đầu tạo một nhóm BufferedImage nhưng tôi đang tìm kiếm các ý tưởng thông minh/tin tức.

Trả lời

0

Bạn có thể xem xét việc triển khai BufferedImage và triển khai thực hiện của riêng bạn (Một triển khai dựa trên tệp có lẽ?). Các lớp này nói chung khá dễ đọc, thường là 50-70% ý kiến ​​và được viết rõ ràng.

Họ đưa ra các nguồn, tại sao không sử dụng chúng?

1

Có một loạt thư viện Java và SO bài đăng về việc này. Bạn đã kiểm tra xem chúng?

+1

Không, tôi đã không kiểm tra chúng. Bạn có đề nghị nào cho vấn đề này không. Ý tôi là, chuyển đổi hình ảnh với dung lượng bộ nhớ thấp –

+0

Không, xin lỗi, tôi đã không sử dụng bất kỳ thứ gì trong số chúng nên tôi không thể đề xuất bất cứ điều gì. Bạn có thể có thể tìm thấy một số kết quả trên Google hoặc bất cứ nơi nào, nhưng đặt cược tốt nhất của bạn là chỉ cần thử chúng mình. –

1

Bạn có thể sử dụng lại một hình ảnh đệm hơn và hơn nữa, sử dụng subimage kích thước thích hợp khi đó là thời gian để sử dụng ImageIO.write phương pháp

+0

Ahap, đó là ý tưởng ban đầu (như câu hỏi mô tả) –

0

Khởi động một trình biến đổi riêng như netpbm hoặc imagemagick.

5

Hãy thử Thumbnailator thư viện: http://code.google.com/p/thumbnailator/

Ví dụ mã:

Thumbnails.of("large-picture.jpg") 
     .scale(1.0) 
     .outputFormat("png") 
     .toOutputStream(os); 

Thư viện cũng cung cấp nhiều hơn nữa như mở rộng quy mô, kích thước, cắt xén, xoay, watermarking, vv

+0

Đây là một thư viện tốt, nhưng nó cũng sử dụng BufferedImage. Có phương pháp nào không sử dụng BufferedImage không? – user2910265