如何将.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)
看起来像.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);
}
}
这里是我使用的图片:MARBLES.TIF,请点击该链接上的MARBLES.TIF。
另外看看Java Docs不得不说这个。希望你能在那里找到有用的东西。
删除了图像,因为我只能将.jpg图像保存在StackOverflow上,所以将其移至我的网站下载。 – 2012-03-09 14:22:22
@mKorbel:其实当我将这张图片保存在stackoverflow上时,他们会自动将它转换为jpg我猜。我会保持它再次看到,当你下载,你可以只下载.jpg从那个:( – 2012-03-09 14:28:16
亚我也得到相同的输出..... 现在是什么解决这个..? – Jony 2012-03-09 14:35:52
-
的ImageIcon的API说
公共的ImageIcon(字节[]的imageData)
创建从一个字节数组,其是从图像文件 含有支持的图像格式读,如一个ImageIcon
GIF
,JPEG
或(截至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中)
没有什么如tiff
或raw
支持,内容是不显示的
- 为图标的ImageIcon共同的属性,不产生任何错误或异常,
你能发送错误信息吗?它与此行有关BufferedImage image = ImageIO.read(listOfFiles [i]); ?也许listOfFiles [i]指向一个不存在的路径,而你期望它指向图像路径,呵呵?调试它。 – Juvanis 2012-03-09 13:12:26
请告诉我们NPE在哪里被抛出,并检查什么是空的。 – Thomas 2012-03-09 13:13:59
另外:除了查询尺寸外,您不使用'image',因此'convertedImage'不包含任何实际的图像信息。您错过了这里的转换。 – Thomas 2012-03-09 13:15:44