2012-03-09 87 views
2

任何人都可以告訴我如何將.TIF格式的圖像存儲到ImageIcon並將此圖像添加到列表模型?我試過這個,但給我java.lang.NullPointerException如何將.TIF圖像設置爲java中的ImageIcon?

public static void main(String[] args) throws Exception { 
    String path = "C:\\project\\aimages"; 
    JFrame frame = new JFrame(); 
    frame.setSize(500, 500); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

    File folder = new File(path); 
    File[] listOfFiles = folder.listFiles(); 
    DefaultListModel listModel = new DefaultListModel(); 
    System.out.println("listOfFiles.length="+listOfFiles.length); 
    int count = 0; 
    for (int i = 0; i < listOfFiles.length; i++) { 
     //System.out.println("check path"+listOfFiles[i]); 
     String name = listOfFiles[i].toString(); 
     System.out.println("name"+name); 
     // load only JPEGs 
     if (name.endsWith("jpg") || name.endsWith("JPG")|| name.endsWith("tif") || name.endsWith("TIF")) { 
      if(name.endsWith("tif") || name.endsWith("TIF")) 
      { 
       BufferedImage image = ImageIO.read(listOfFiles[i]); 
      BufferedImage convertedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); 
       ImageIcon ii = new ImageIcon(image); 
        Image img1 = ii.getImage(); 
       Image newimg = img1.getScaledInstance(75, 75, java.awt.Image.SCALE_SMOOTH); 
        ImageIcon newIcon = new ImageIcon(img1); 
        listModel.add(count++, newIcon); 
      } 
      else 
      { 
       ImageIcon ii = new ImageIcon(ImageIO.read(listOfFiles[i])); 
       Image img1 = ii.getImage(); 
       Image newimg = img1.getScaledInstance(75, 75, java.awt.Image.SCALE_SMOOTH); 
       ImageIcon newIcon = new ImageIcon(newimg); 
      listModel.add(count++, newIcon); 
      } 
     } 
    } 
    JList p2 = new JList(listModel); 

    } 
    } 

在這裏,我已經編輯我的代碼,這是我的錯誤味精 異常線程 「main」 顯示java.lang.NullPointerException 在javax.swing.ImageIcon中。(ImageIcon.java:228) 在ListImage1 .main(ListImage1.java:48)

+0

你能發送錯誤信息嗎?它與此行有關BufferedImage image = ImageIO.read(listOfFiles [i]); ?也許listOfFiles [i]指向一個不存在的路徑,而你期望它指向圖像路徑,呵呵?調試它。 – Juvanis 2012-03-09 13:12:26

+0

請告訴我們NPE在哪裏被拋出,並檢查什麼是空的。 – Thomas 2012-03-09 13:13:59

+1

另外:除了查詢尺寸外,您不使用'image',因此'convertedImage'不包含任何實際的圖像信息。您錯過了這裏的轉換。 – Thomas 2012-03-09 13:15:44

回答

5

如果TIFF是一種應用程序資源,可能是更好的將其轉換爲JPG或PNG。

OTOH,我相信JAI支持閱讀TIFF。

+0

+1以及我引用的Java Docs包含一個示例程序。 – 2012-03-09 15:31:14

+0

相關提示+1 – mKorbel 2012-03-09 16:04:04

5

看起來像.TIF不支持ImageIO。請看看通過ImageIO支持formats使用ImageIO.getReaderFormatNames(),當我這樣做,我得到的輸出:

C:\Mine\JAVA\J2SE\classes>java TestBorder 
jpg 
BMP 
bmp 
JPG 
jpeg 
wbmp 
png 
JPEG 
PNG 
WBMP 
GIF 
gif 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
     at javax.swing.ImageIcon.<init>(ImageIcon.java:228) 
     at TestBorder.createAndDisplayGUI(TestBorder.java:34) 
     at TestBorder.access$100(TestBorder.java:6) 
     at TestBorder$1.run(TestBorder.java:55) 
     at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) 
     at java.awt.EventQueue.access$000(EventQueue.java:101) 
     at java.awt.EventQueue$3.run(EventQueue.java:666) 
     at java.awt.EventQueue$3.run(EventQueue.java:664) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:675) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 

這是我想它在程序:

import java.awt.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 
import javax.imageio.ImageIO; 

public class TestBorder extends JPanel 
{ 
    private static TestBorder testBorder; 
    public TestBorder() 
    {  
    } 

    private static void createAndDisplayGUI() 
    { 
     JFrame frame = new JFrame("FRAME"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationByPlatform(true); 
     testBorder.setBackground(Color.BLUE); 

     java.net.URL url = testBorder.getClass().getResource("/image/MARBLES.TIF"); 
     BufferedImage image = null; 
     try 
     { 
      image = ImageIO.read(url); 
      String[] formatNames = ImageIO.getReaderFormatNames(); 
      for (String s: formatNames) 
       System.out.println(s); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

     ImageIcon imageIcon = new ImageIcon(image); 
     JLabel label = new JLabel(imageIcon); 
     testBorder.add(label); 

     frame.add(testBorder, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public Dimension getPreferredSize() 
    { 
     return (new Dimension(300, 300)); 
    } 

    public static void main(String... args) 
    { 
     Runnable runnable = new Runnable() 
     { 
      public void run() 
      { 
       testBorder = new TestBorder(); 
       createAndDisplayGUI(); 
      } 
     }; 
     SwingUtilities.invokeLater(runnable); 
    } 
} 

Image for Question 這裏是我使用的圖片:MARBLES.TIF,請點擊該鏈接上的MARBLES.TIF。

另外看看Java Docs不得不說這個。希望你能在那裏找到有用的東西。

+0

刪除了圖像,因爲我只能將.jpg圖像保存在StackOverflow上,所以將其移至我的網站下載。 – 2012-03-09 14:22:22

+0

@mKorbel:其實當我將這張圖片保存在stackoverflow上時,他們會自動將它轉換爲jpg我猜。我會保持它再次看到,當你下載,你可以只下載.jpg從那個:( – 2012-03-09 14:28:16

+0

亞我也得到相同的輸出..... 現在是什麼解決這個..? – Jony 2012-03-09 14:35:52

2
  • 的ImageIcon的API說

    公共的ImageIcon(字節[]的imageData)

    創建從一個字節數組,其是從圖像文件 含有支持的圖像格式讀,如一個ImageIcon GIFJPEG或(截至1.3)PNG。 通常這個數組是通過使用 Class.getResourceAsStream()來讀取圖像而創建的,但是字節數組也可以靜態存儲在類 中。如果生成的圖像具有字符串「註釋」屬性 ,則該字符串用作該圖標的描述。

    參數: 的imageData - 像素在圖像格式的陣列由AWT 工具包的支持,諸如GIF,JPEG,或(如1.3)PNG 另請參見: Toolkit.createImage(java.lang中。字符串),getDescription(), Image.getProperty(java.lang.String中,java.awt.image.ImageObserver中)

沒有什麼如tiffraw支持,內容是不顯示的

  • 爲圖標的ImageIcon共同的屬性,不產生任何錯誤或異常,
相關問題