Как установить изображение .TIF в ImageIcon в Java? - PullRequest
2 голосов
/ 09 марта 2012

Может кто-нибудь предложить мне, как сохранить изображение в формате .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 ]

5 голосов
/ 09 марта 2012

Если TIFF является ресурсом приложения, возможно, лучше преобразовать его в JPG или PNG.

OTOH, я считаю, что JAI предлагает поддержку чтения TIFF.

5 голосов
/ 09 марта 2012

Похоже, .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 должен сказать для этого.Надеюсь, вы сможете найти там что-нибудь полезное.

2 голосов
/ 09 марта 2012
  • API ImageIcon сообщает

    public ImageIcon (byte [] imageData)

    Создает ImageIcon из массива байтов, которые были прочитаны из файла изображения, содержащего поддерживаемыйформат изображения, например GIF, JPEG или (по состоянию на 1.3) PNG.Обычно этот массив создается путем чтения изображения с использованием Class.getResourceAsStream (), но байтовый массив также может статически храниться в классе.Если полученное изображение имеет свойство «comment», представляющее собой строку, то в качестве описания этого значка используется строка.

    Параметры: imageData - массив пикселей в формате изображения, поддерживаемом AWT Toolkit., такие как GIF, JPEG или (по состоянию на 1.3) PNG См. также: Toolkit.createImage (java.lang.String), getDescription (), Image.getProperty (java.lang.String, java.awt.image.ImageObserver)

нет ничего такого, как поддержка tiff или raw, содержимое не отображается

  • общий атрибут для Icon и ImageIcon, который неt генерирует любую ошибку или исключение,
...