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

时间:2012-03-09 13:00:43

标签: java swing jlist

有人可以建议我如何将.TIF格式的图像存储到ImageIcon并将此图像添加到列表模型中吗?我尝试了这个但是给了我java.lang.NullPointerException

  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)

3 个答案:

答案 0 :(得分:5)

.TIF不支持ImageIO。使用formats查看ImageIO支持的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对此有何看法。希望你能找到有用的东西。

答案 1 :(得分:5)

如果TIFF是应用程序资源,最好将其转换为JPG或PNG。

OTOH,我相信JAI支持阅读TIFF。

答案 2 :(得分:2)

  • ImageIcon的API说

    public ImageIcon(byte [] imageData)

    从一个从图像文件中读取的字节数组创建一个ImageIcon 包含受支持的图片格式,例如GIFJPEG或(从1.3开始)PNG。 通常,此数组是通过使用读取图像创建的 Class.getResourceAsStream(),但字节数组也可以静态存储 在课堂上。如果生成的图像具有字符串的“comment”属性, 然后该字符串用作此图标的描述。

    参数:     imageData - AWT支持的图像格式的像素数组     工具包,例如GIF,JPEG或(从1.3开始)PNG 也可以看看:     Toolkit.createImage(java.lang.String),getDescription(),     Image.getProperty(java.lang.String,java.awt.image.ImageObserver)

没有任何内容支持tiffraw,内容无法显示

  • Icon和ImageIcon的公共属性,不会产生任何错误或异常,