如何将.TIF图像设置为java中的ImageIcon?

问题描述:

任何人都可以告诉我如何将.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

如果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

看起来像.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图像保存在*上,所以将其移至我的网站下载。 – 2012-03-09 14:22:22

+0

@mKorbel:其实当我将这张图片保存在*上时,他们会自动将它转换为jpg我猜。我会保持它再次看到,当你下载,你可以只下载.jpg从那个:( – 2012-03-09 14:28:16

+0

亚我也得到相同的输出..... 现在是什么解决这个..? – Jony 2012-03-09 14:35:52

  • 的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共同的属性,不产生任何错误或异常,