2012-06-18 56 views
14

Vì vậy, tôi đang tạo một ứng dụng để lưu trữ lối tắt tới tất cả các ứng dụng yêu thích của người dùng, hoạt động giống như một trung tâm. Tôi có thể hỗ trợ các tệp thực và tôi có trình phân tích cú pháp .lnk cho các phím tắt. Tôi nghĩ rằng nó sẽ là khá tốt cho các ứng dụng để hỗ trợ các phím tắt Internet, quá. Đây là những gì tôi đang làm:Làm thế nào để có được favicon.ico từ một trang web bằng cách sử dụng Java?

Giả sử tôi đang cố gắng để có được Google's icon (http://www.google.com/favicon.ico).

  1. tôi bắt đầu ra bằng cách loại bỏ các trang phụ (ví dụ www.google.com/anotherpage sẽ trở thành www.google.com.

  2. Sau đó, tôi sử dụng ImageIO.read(java.net.URL) để có được những hình ảnh.

Vấn đề là ImageIO không bao giờ trả về Hình ảnh khi tôi gọi phương thức này:

String trimmed = getBaseURL(page); //This removes the extra pages 
Image icon = null;  
try { 
    String fullURLString = trimmed + "/favicon.ico"; 
    URL faviconURL = new URL(fullURLString); 
    icon = ImageIO.read(faviconURL); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

return icon; 

Bây giờ tôi có hai câu hỏi:

  1. Java có hỗ trợ định dạng ICO mặc dù nó là của Microsoft không?
  2. Tại sao ImageIO không đọc được từ URL?

Cảm ơn bạn trước!

+0

[Nếu không có đăng ký ImageReader nào có thể đọc luồng kết quả, thì giá trị rỗng được trả về.] (Http://docs.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html) –

+0

@HunterMcMillen Không, bạn có thể giải thích một chút được không? – mattbdean

+0

bạn có chắc chắn rằng 'getBaseURL()' loại bỏ chuỗi cuối cùng không? Nếu không, bạn đang cố gắng lấy hình ảnh từ www.google.com//favicon.ico. – 11684

Trả lời

10

Hãy thử Image4J.

Như này nhanh chóng Scala REPL chương trình phiên (dán-thể như mã Java):

> net.sf.image4j.codec.ico.ICODecoder.read(new java.net.URL("http://www.google.com/favicon.ico").openStream()) 

res1: java.util.List[java.awt.image.BufferedImage] = [[email protected]: type = 2 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=ff000000 IntegerInterleavedRaster: width = 16 height = 16 #Bands = 4 xOff = 0 yOff = 0 dataOffset[0] 0] 

CẬP NHẬT

Để trả lời câu hỏi của bạn: Liệu ICO hỗ trợ Java? Có vẻ như không:

> javax.imageio.ImageIO.read(new java.net.URL("http://www.google.com/favicon.ico")) 

java.lang.IllegalArgumentException: Empty region! 

Tại sao ImageIO không đọc được từ URL? Vâng, chính URL đó có vẻ phù hợp với tôi, vì vậy bạn có thể gặp sự cố proxy/tường lửa hoặc có thể là vấn đề ở trên.

+0

Cảm ơn bạn! Thư viện đó thực sự tốt! – mattbdean

+0

Đó là một niềm vui :) – opyate

+0

@opyate Đó là một [lỗi] (http://bugs.sun.com/view_bug.do;jsessionid=cf757a2e4d6ffffffff9113c0c3c674747?bug_id=6633448) trong Java. Lớp ImageIO cố gắng sử dụng 'WBMPImageReader' làm trình phân tích cú pháp ico nhưng không thành công. Vấn đề được ghi lại bằng một vài định dạng khác (ví dụ .mov). Theo báo cáo lỗi, sự cố được khắc phục từ 7 (b63). Cách khắc phục là tắt 'WBMPImageReader'. – user845279

3

Bạn không cần ImageIO cho việc này. Chỉ cần sao chép các byte, giống như đối với bất kỳ tài nguyên tĩnh nào khác.

4

Cũ bưu điện, nhưng để tham khảo trong tương lai:

Tôi đã viết một plugin cho ImageIO bổ sung hỗ trợ cho các định dạng .ico (MS Windows Icon) và .CUR (MS Windows Cursor).

Bạn có thể lấy nó từ GitHub ở đây: https://github.com/haraldk/TwelveMonkeys/

Sau khi bạn có installed plugin, bạn sẽ có thể đọc các biểu tượng, sử dụng các mã trong các bài bản gốc mà không cần bất kỳ sửa đổi.

+0

Thư viện của bạn thật tuyệt vời tôi đã tìm thấy nó ngay hôm nay! – GOXR3PLUS

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