有人可以建议我如何将.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)
答案 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);
}
}
这是我正在使用的图像:MARBLES.TIF,请点击该链接上的MARBLES.TIF。
此外,请看看Java Docs对此有何看法。希望你能找到有用的东西。
答案 1 :(得分:5)
如果TIFF是应用程序资源,最好将其转换为JPG或PNG。
OTOH,我相信JAI支持阅读TIFF。
答案 2 :(得分:2)
ImageIcon的API说
public ImageIcon(byte [] imageData)
从一个从图像文件中读取的字节数组创建一个ImageIcon
包含受支持的图片格式,例如GIF
,JPEG
或(从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)
没有任何内容支持tiff
或raw
,内容无法显示