BufferedImage/Image Conversion

Meo*_*Mix 1 java swing image

使用ImageIO加载图像时,将返回a BufferedImage.我BufferedImage在函数中使用了这个java.awt.image.BufferedImage.getSubimage(int,int,int,int).现在......我需要打印一些这些BufferedImage,但java.awt.Graphics.drawImage(Image,int,int,null)功能需要一个Image,而不是一个BufferedImage.如何将a转换BufferedImageImage?码:

import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import java.awt.Image;
import java.io.*;
import java.net.URL;
import javax.imageio.*;
import java.awt.image.*;
import java.awt.Font;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.BufferedImage;

public class engine{
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                GUI();
                }
            });
        }
    private static void GUI(){
        JFrame f = new JFrame("Daealia");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setPreferredSize(new Dimension(800, 600));
    f.add(new p());
    f.pack();
        f.setVisible(true);

    }
}
class p extends JPanel{
    public p(){}
        public engine eng = new engine();   
        public BufferedImage[][] spells;
        public BufferedImage image;
        public void paintComponent(Graphics g){
            g.setColor(new Color(82,41,0));
            g.fillRect(0,0,74,254);
            g.setColor(new Color(16,8,0));
            g.drawRect(0,0,74,254);
            try{
            image = ImageIO.read(new File("spells.png"));} catch(IOException e){System.out.println("EXCEPTION THROWN!");
            }
            for(int k = 0; k <= 6; k++){
                spells[k][1] = image.getSubimage((34*2*k)-34*2,0,34,34);
            }
            for(int j = 0; j <= 6; j++){
                spells[j][2] = image.getSubimage((34*2*j)-34,0,34,34);
            }
            for(int a = 0; a <= 6; a++){
                for(int b = 0; b <= 1; b++){
                    g.drawImage(spells[a][b],1+((b-1)*34),1+((a-1)*34),null);
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑:我得到的错误是:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at p.paintComponent(engine.java:51)
    at javax.swing.JComponent.paint(JComponent.java:1045)
    at javax.swing.JComponent.paintChildren(JComponent.java:878)
    at javax.swing.JComponent.paint(JComponent.java:1054)
    at javax.swing.JComponent.paintChildren(JComponent.java:878)
    at javax.swing.JComponent.paint(JComponent.java:1054)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:585)
    at javax.swing.JComponent.paintChildren(JComponent.java:878)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5219)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1236)
    at javax.swing.JComponent.paint(JComponent.java:1031)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
    at java.awt.Container.paint(Container.java:1967)
    at java.awt.Window.paint(Window.java:3877)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:807)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:784)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:784)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:757)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706)
    at javax.swing.RepaintManager.access$1000(RepaintManager.java:62)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1647)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at p.paintComponent(engine.java:51)
    at javax.swing.JComponent.paint(JComponent.java:1045)
    at javax.swing.JComponent.paintChildren(JComponent.java:878)
    at javax.swing.JComponent.paint(JComponent.java:1054)
    at javax.swing.JComponent.paintChildren(JComponent.java:878)
    at javax.swing.JComponent.paint(JComponent.java:1054)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:585)
    at javax.swing.JComponent.paintChildren(JComponent.java:878)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5219)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1236)
    at javax.swing.JComponent.paint(JComponent.java:1031)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
    at java.awt.Container.paint(Container.java:1967)
    at java.awt.Window.paint(Window.java:3877)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:807)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:784)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:784)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:757)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706)
    at javax.swing.RepaintManager.access$1000(RepaintManager.java:62)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1647)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 7

BufferedImage 一个Image,换句话说,它是从Image抽象类扩展而来的.你不需要转换任何东西.

请查看BufferedImage API以获取详细信息.


编辑
你在评论中说:

当我运行此代码时,我的控制台中出现错误的垃圾邮件.它为什么要这样做?当java文件转换为类时,它没有找到错误.

然后,您将要发布您收到的任何错误/异常消息,并指出我们将哪些行抛出.

另外,您永远不会想要从paintComponent方法中读取图像.这种方法应该是精益的,卑鄙的,快速的,并且只关注绘画和绘画.为什么只需要在构造函数中将其读入变量时,多次读入图像?


编辑2
您的错误是engine.java:51在engine.java类的第51行上发生的NullPointerException .请注意,这与使用BufferedImage与Image 无关,而与尝试使用null引用变量有关.我怀疑,问题的关键在于异常消息.在将来的问题中,您需要发布任何和所有异常消息,指出抛出它们的行.


编辑3
永远不要这样做:

try{
   image = ImageIO.read(new File("spells.png"));
} catch(IOException e) {

}
Run Code Online (Sandbox Code Playgroud)

永远不要把你的捕获块留空.至少打印堆栈跟踪.否则,如果发生错误,您将不知道.


编辑4
您在评论中说明:

关于编辑的注意事项:当spritesheet和sprite的声明放在paintComponent方法之外时.20个代码在变量上有不必要的错误,有时用大括号说"engine.java:<line>: class, interface, or enum expected"

从你的错误中,我猜你已经有了调用方法的代码,在任何构造函数或方法之外的类中裸露出来,它不属于它.我建议你在类中声明你的Image变量,并在你的构造函数中初始化它(现在它是空的).

而且,你需要告诉我们哪一行抛出异常.


编辑5
您在评论中说明:

第51行是法术[k] [1] = image.getSubimage((34*2*k)-34*2,0,34,34);

这就像我在上次评论中猜到的那样.这意味着图像为空,您尝试读取它是错误的.通常这是因为在错误的位置查找文件,或者如果在jar文件中,首先尝试使用文件.您需要考虑将Image作为资源而不是文件.

要调试这个,尝试简化你的程序 - 只需创建一个非常小的程序,读入一个Image,从中创建一个ImageIcon,并在一个JOptionPane.showMessageDialog(null, yourIconHere).中显示ImageIcon .


编辑6
例如,尝试使用以下内容测试代码:

import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class SimpleTestImage {
   public static void main(String[] args) {
      String path = "spells.png";
      InputStream inputStream = SimpleTestImage.class.getResourceAsStream(path);
      try {
         BufferedImage img = ImageIO.read(inputStream);
         ImageIcon icon = new ImageIcon(img);
         JOptionPane.showMessageDialog(null, icon);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我不使用File来获取Image,而是使用InputStream作为类资源.执行此操作时,Java将开始在您拥有类文件的相同位置查找图像.

再次,在类的构造函数中读取Image.