Java getSubimage() en dehors de raster
Je suis en train de prendre une image et la stocker dans une matrice de 16x16, des sous-images. L'image que j'utilise est 512x512 pixels. Cependant, lors de l'itération dans la boucle, getSubimage() est arrêté par un Raster exception.
Voici le code:
public class TileList extends JPanel {
private static final int width = 16; //width of a tile
private static final int height = width;
private int col = 1;
private int row = 1;
private BufferedImage image;
File tilesetImage = new File("image.png");
BufferedImage tileset[];
public void loadAndSplitImage (File loadImage) {
try{
image = ImageIO.read(loadImage);
}catch(Exception error) {
System.out.println("Error: cannot read tileset image.");
}//end try/catch
col = image.getWidth()/width;
row = image.getHeight()/height;
tileset = new BufferedImage[col*row];
}//end loadAndSplitImage
public TileList() {
loadAndSplitImage(tilesetImage);
setLayout(new GridLayout(row,col,1,1));
setBackground(Color.black);
int x=0;
int y=0;
int q=0; //keeps track of tile #
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
JPanel panel = new JPanel();
tileset[q] = new BufferedImage(width, height, image.getType());
tileset[q] = image.getSubimage(x,y,x + width,y + height);
panel.add(new JLabel(new ImageIcon(tileset[q])));
add(panel);
x += width;
q++;
}//end for loop
y += height;
x = 0;
}//end for loop
}//end constructor
}//end class
C'est l'erreur:
Exception in thread "AWT-EventQueue-0" java.awt.image.RasterFormatException: (x
+ width) is outside of Raster
at sun.awt.image.ByteInterleavedRaster.createWritableChild(ByteInterleav
edRaster.java:1245)
at java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1173)
at TileList.<init>(TileList.java:59)
at TileList.createAndShowGui(TileList.java:79)
at TileList$1.run(TileList.java:88)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo
main.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
OriginalL'auteur Emily | 2013-01-11
Vous devez vous connecter pour publier un commentaire.
Vous êtes de passage le mauvais paramètres de
getSubimage
. Les docs disent...Vous êtes de passage dans
x, y, x + width, y + width
, ce qui signifierait, six
= 256,width
fait est égal à256 + 16 = 272
.De sorte que vous nouvelle image serait ...
x + width = 256 + 272 = 528
, qui est plus large, alors votre zone de l'image.Vous devriez être en train de passer
x, y, width, heigh
OriginalL'auteur MadProgrammer
De la javadoc
cela signifie que la ligne suivante est faux
il devrait être quelque chose comme
Pour un travail complet exemple prendre un coup d'oeil à ce coller
OriginalL'auteur atomman