2012-05-24 2 views
0

Я пытаюсь использовать код, как видно на еще вопросы отвечают: https://stackoverflow.com/a/621849/1044984растровый формат Exception (Java)

При использовании этого я получаю следующее сообщение об ошибке:

Exception in thread "AWT-EventQueue-0" java.awt.image.RasterFormatException: (y + height) is outside of Raster 
    at sun.awt.image.ByteInterleavedRaster.createWritableChild(Unknown Source) 
    at java.awt.image.BufferedImage.getSubimage(Unknown Source) 
    at main.Grid.paintComponent(Grid.java:111) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JLayeredPane.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paintToOffscreen(Unknown Source) 
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source) 
    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source) 
    at javax.swing.RepaintManager.paint(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source) 
    at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source) 
    at sun.awt.SunGraphicsCallback.runComponents(Unknown Source) 
    at java.awt.Container.paint(Unknown Source) 
    at java.awt.Window.paint(Unknown Source) 
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source) 
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

Вот код связанные с этой ошибкой:

try { 

      tileSheetBig = ImageIO.read(new File("sprites/tiles.png")); 
      charSheetBig = ImageIO.read(new File("sprites/player.png")); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     final int tileWidth = 64; 
     final int tileHeight = 64; 
     final int tileRows = 1; 
     final int tileCols = 11; 
     tileSheet = new BufferedImage[tileRows * tileCols]; 

     for (int i = 0; i < tileRows; i++) { 
      for (int j = 0; j < tileCols; j++) { 
       tileSheet[(i * tileCols) + j] = tileSheetBig.getSubimage(i 
         * tileWidth, j * tileHeight, tileWidth, tileHeight); 
      } 
     } 

     final int charWidth = 16; 
     final int charHeight = 23; 
     final int charRows = 2; 
     final int charCols = 3; 
     charSheet = new BufferedImage[charRows * charCols]; 

     for (int i = 0; i < charRows; i++) { 
      for (int j = 0; j < charCols; j++) { 
       charSheet[(i * charCols) + j] = charSheetBig.getSubimage(i 
         * charWidth, j * charHeight, charWidth, charHeight); 
      } 
     } 

с тех пор не сильно изменился с код, предоставленный на ответ, который я не могу увидеть, что проблема может быть. Я попытался сделать ошибку Google, но не так много ответов, связанных с моей проблемой.

ответ

1

То есть RasterFormatExceptionthrown по getSubImage(), когда область определяется [х, у: х + ширина, высота у +] не содержится в пределах BufferedImage области.

Проверьте, что ваше изображение tiles.png не менее 704x64 пикселей (ширина * cols, высота * rows) и аналогично, что player.png составляет не менее 48x46 px.

EDIT: Извините, я не заметил его на первый взгляд; player.png должен быть 32x69 px и tiles.png 64x704 px

EDIT 2: это исправляет ваш код для плеера без редактирования спрайтов; сделать то же самое для плитки

final int charWidth = 64; 
final int charHeight = 64; 
final int charCols = 11; 
final int charRows = 1; 
for (int i = 0; i < charCols; i++) { 
    for (int j = 0; j < charRows; j++) { 
     charSheet[i * charRows + j] = charSheetBig 
      .getSubimage(i * charWidth, j * charHeight, charWidth, charHeight); 
    } 
} 
+0

tiles.png is 704 by 64px. player.png - 48 на 46 пикселей. – ComputerLocus

+0

см. Мое редактирование; вы используете index * i * для перехода от 0 к переменной с именем * charRows *, но на самом деле вы используете ее для выбора спрайта по оси x (так для столбцов); и наоборот для индекса * y *. То же самое относится к tiles.png –

+0

Итак, ваше высказывание моих изображений должно быть вертикальным, а не горизонтальным, а player.png даже имеет разные размеры раньше? – ComputerLocus