2010-04-27 69 views
11

Xin chào Tôi muốn biết nếu có cách nào trong Java để giảm kích thước của một hình ảnh (sử dụng bất kỳ loại nén nào) được tải dưới dạng BufferedImage và sẽ được lưu dưới dạng PNG.cách nén hình ảnh PNG bằng Java

Có thể một số loại png imagewriteparam? Tôi đã không tìm thấy bất cứ điều gì hữu ích để im bị mắc kẹt.

heres một mẫu như thế nào hình ảnh được tải và lưu

public static BufferedImage load(String imageUrl) {   
    Image image = new ImageIcon(imageUrl).getImage(); 
    bufferedImage = new BufferedImage(image.getWidth(null), 
                image.getHeight(null), 
                BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2D = bufferedImage.createGraphics(); 
    g2D.drawImage(image, 0, 0, null); 
    return bufferedImage; 
} 

public static void storeImageAsPng(BufferedImage image, String imageUrl) throws IOException { 
    ImageIO.write(image, "png", new File(imageUrl)); 
} 
+0

Có "loại nén nào" bao gồm nén mất dữ liệu không? Bởi vì sau đó lưu trữ hình ảnh dưới định dạng JPEG có thể tiết kiệm rất nhiều không gian. –

+0

PNG là định dạng nén không mất (miễn là hình ảnh nguồn của bạn không sử dụng nhiều hơn 8 bit cho mỗi kênh: nếu bạn chuyển đổi, hình ảnh RGB 48 bit thành PNG, PNG trở nên mất dữ liệu), do đó bạn không thể đạt được nhiều. Tuy nhiên, có rất nhiều công cụ tạo PNG nhỏ hơn nhiều so với bình thường và chúng đặc biệt hữu ích nếu bạn cần PNG của mình cho các thiết bị có bộ nhớ: PNGOUT là một công cụ và được lập trình bởi một trong những lập trình viên giỏi nhất bao giờ: http: //advsys.net/ken/utils.htm#pngout – SyntaxT3rr0r

+0

ngay, như Joachim hỏi, không nén mất dữ liệu, chỉ giảm kích thước của tệp hình ảnh như được sử dụng bởi zip và do đó, không nên có các công cụ bên ngoài có liên quan như PNGOUT, vì vậy nó có thể là một số loại thư viện hỗ trợ và ImageWriteParam cho PNG như JPEGImageWriteParam, xem xmlgraphics-commons 1.3.1 atm. Xin lỗi nếu im nhận được khó hiểu trong một số phần im vẫn còn là một người mới, chỉ thoguht câu trả lời có thể giúp tôi ra hoặc truyền cảm hứng cho người khác với một vấn đề tương tự. Cảm ơn bạn đã đề xuất cho đến thời điểm này. – ubernoob

Trả lời

1

Hãy nhìn vào lớp ImageWriterParam trong gói giống như lớp ImageIO. Nó đề cập đến nén.

https://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageWriteParam.html

Ngoài ra nhìn vào ví dụ ở http://exampledepot.com/egs/javax.imageio/JpegWrite.html và xem nếu nó dịch tốt cho các tập tin PNG.

+2

Nó sẽ ném một ngoại lệ nếu bạn muốn sử dụng chế độ nén rõ ràng cho PNG thông báo cho bạn biết rằng điều này không được hỗ trợ cho định dạng này. Vì vậy, các tham số được áp dụng cho JpegWriter không được áp dụng cho PNG. –

2

Nếu it's going to be saved as PNG, quá trình nén sẽ được thực hiện ở giai đoạn đó. PNG có thuật toán nén không mất dữ liệu (về cơ bản dự đoán tiếp theo là nén lempel-ziv) với một vài thông số có thể điều chỉnh (loại "filters") và không ảnh hưởng nhiều đến số lượng nén - nói chung mặc định sẽ tối ưu.

+1

Từ những gì tôi đã đọc về các tùy chọn png-save gimps, mức độ nén (cài đặt từ 1 đến 9) xác định nén (nỗ lực của bộ mã hóa), mặc dù nó ít hao tổn hơn bất kể bạn thiết lập gì. – aioobe

+0

Vâng, nó chỉ là vấn đề chọn một trong bốn 'bộ lọc' (thực sự là những người dự đoán, xem liên kết ở trên) để sử dụng, có lẽ sử dụng các bộ lọc riêng biệt cho các dòng khác nhau. Nó luôn luôn là mất mát. – leonbloy

2

Bạn có thể muốn thử pngtastic. Đó là một trình tối ưu hóa hình ảnh java png thuần túy có thể thu nhỏ hình ảnh png xuống một mức độ nào đó.

Các vấn đề liên quan