Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将子图像从精灵工作表中获取到数组中_Java_Arrays_Image_Sprite - Fatal编程技术网

Java 如何将子图像从精灵工作表中获取到数组中

Java 如何将子图像从精灵工作表中获取到数组中,java,arrays,image,sprite,Java,Arrays,Image,Sprite,我有一个精灵表,将是5x5,每个精灵是20x20像素。我需要将精灵表中的每一项放入一个数组。我对循环执行了一个,但出现了一个错误。所以我尝试自己定义数组中的一个子映像,但仍然得到一个错误。当我不打印该数组的项时,我不会收到错误。我现在无法解决for循环问题 这是到目前为止我的代码 import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.io.*; import javax.imageio.*

我有一个精灵表,将是5x5,每个精灵是20x20像素。我需要将精灵表中的每一项放入一个数组。我对循环执行了一个
,但出现了一个错误。所以我尝试自己定义数组中的一个子映像,但仍然得到一个错误。当我不打印该数组的项时,我不会收到错误。我现在无法解决for循环问题

这是到目前为止我的代码

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;


public class LoopSub extends Component {

    BufferedImage img;
    BufferedImage img2;
    BufferedImage bigImg;
    BufferedImage[] sprites;

    public void paint(Graphics g) {
        g.drawImage(img, 0, 0, null);
        g.drawImage(img2, 18, 0, null); //letter size 20x20 ; set lower to overlap
        g.drawImage(sprites[0], 36, 0, null); //this is whats causing the error

    }

    public LoopSub() {
       try {
           img = ImageIO.read(new File("res/a.png"));
           img2 = ImageIO.read(new File("res/b.png"));



           /////////////////////////////


        bigImg = ImageIO.read(new File("sheet.png"));


        final int width = 20;
        final int height = 20;
        final int rows = 5;
        final int cols = 5;
        sprites = new BufferedImage[rows * cols];



        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                sprites[(i * cols) + j] = bigImg.getSubimage(
                    j * width,
                    i * height,
                    width,
                    height
                );
            }
        }

        sprites[0] = bigImg.getSubimage(1,1,1,1); //where I tried to define the array myself

           /////////////////////////////////////////////


       } catch (IOException e) {
       }

    }

    public Dimension getPreferredSize() { //sets size of screen
        if (img == null) {
             return new Dimension(100,100);
        } else {
           return new Dimension(img.getWidth(null), img.getHeight(null)); //sets size to one image //// change to all images
       }
    }

    public static void main(String[] args) {

        JFrame f = new JFrame("Load Image Sample");

        f.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });

        f.add(new LoopSub());
        f.pack();
        f.setVisible(true);
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.awt.image.*;
导入java.io.*;
导入javax.imageio.*;
导入javax.swing.*;
公共类LoopSub扩展组件{
缓冲图像img;
缓冲图像img2;
缓冲图像放大;
BuffereImage[]精灵;
公共空间涂料(图g){
g、 drawImage(img,0,0,null);
g、 drawImage(img2,18,0,null);//字母大小20x20;设置为较低以重叠
g、 drawImage(精灵[0],36,0,null);//这是导致错误的原因
}
公营房屋小组(){
试一试{
img=ImageIO.read(新文件(“res/a.png”);
img2=ImageIO.read(新文件(“res/b.png”);
/////////////////////////////
bigImg=ImageIO.read(新文件(“sheet.png”);
最终整数宽度=20;
最终内部高度=20;
最终整数行=5;
最终整数cols=5;
sprites=新的BufferedImage[rows*cols];
对于(int i=0;i
新错误消息

Exception in thread "main" java.awt.image.RasterFormatException: (x + width) is outside of Raster
    at sun.awt.image.ByteInterleavedRaster.createWritableChild(Unknown Source)
    at java.awt.image.BufferedImage.getSubimage(Unknown Source)
    at LoopSub.<init>(LoopSub.java:48)
    at LoopSub.main(LoopSub.java:85)
线程“main”java.awt.image.RasterFormatException中的异常:(x+宽度)在光栅外部 位于sun.awt.image.ByteInterleavedRaster.createWritableChild(未知源) 位于java.awt.image.BuffereImage.getSubimage(未知源) 在LoopSub.(LoopSub.java:48) 在LoopSub.main(LoopSub.java:85)

j*width
更改为1时,效果良好。这就是问题所在。只是不知道为什么。

您有一个
NullPointerException
,这意味着
sprites
sprites[0]
null

假设您在构造函数中初始化它们,则只有当构造函数中发生
IOException
时才会发生,因为您正在捕获它,因此它不会终止程序

你应该:

  • 永远不要像您在这里所做的那样,默默地忽略异常。如果您没有执行任何有用的操作,请至少发送一条消息以打印错误,如下所示:

       } catch (IOException e) {
           e.printStackTrace();
       }
    
  • 看看异常的内容是什么,它包含了问题的根源。可能由于某种原因,程序找不到您的某个文件

编辑:对于
光栅格式异常
,这意味着您超出了图像的限制。更具体地说,
j*width+width
明显大于图像的宽度

由于j最多为4,
width
为20,因此
j*width+width
可以具有的最大值为100。您的原始图像应至少为100px宽(也应为100px高)。检查是否确实如此

例如,可以在循环之前以这种方式打印宽度:

System.out.println("bigImg width: " + bigImg.getWidth());

您有一个
NullPointerException
,这意味着
sprites
sprites[0]
null

假设您在构造函数中初始化它们,则只有当构造函数中发生
IOException
时才会发生,因为您正在捕获它,因此它不会终止程序

你应该:

  • 永远不要像您在这里所做的那样,默默地忽略异常。如果您没有执行任何有用的操作,请至少发送一条消息以打印错误,如下所示:

       } catch (IOException e) {
           e.printStackTrace();
       }
    
  • 看看异常的内容是什么,它包含了问题的根源。可能由于某种原因,程序找不到您的某个文件

编辑:对于
光栅格式异常
,这意味着您超出了图像的限制。更具体地说,
j*width+width
明显大于图像的宽度

由于j最多为4,
width
为20,因此
j*width+width
可以具有的最大值为100。您的原始图像应至少为100px宽(也应为100px高)。检查是否确实如此

例如,可以在循环之前以这种方式打印宽度:

System.out.println("bigImg width: " + bigImg.getWidth());

我仍然有一个for循环的问题。我将更新帖子。sheet.png的大小是多少?它应该是100x100或更大。我仍然有一个for循环的问题。我将更新帖子。sheet.png的大小是多少?它应该是100x100或更大。