質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

1回答

574閲覧

画像の切り取り時に例外が発生する

yukkuri

総合スコア624

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

0グッド

0クリップ

投稿2019/01/07 08:24

現在、画像を切り取り表示するプログラムを作っていました。

エラー

Exception in thread "AWT-EventQueue-0" java.awt.image.RasterFormatException: (x + width) is outside of Raster at sun.awt.image.ByteInterleavedRaster.createWritableChild(ByteInterleavedRaster.java:1245) at java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1202) at myrpg.main.MyGUI.paintComponent(MyGUI.java:88) at javax.swing.JComponent.paint(JComponent.java:1056) at javax.swing.JComponent.paintChildren(JComponent.java:889) at javax.swing.JComponent.paint(JComponent.java:1065) at javax.swing.JComponent.paintChildren(JComponent.java:889) at javax.swing.JComponent.paint(JComponent.java:1065) at javax.swing.JLayeredPane.paint(JLayeredPane.java:586) at javax.swing.JComponent.paintChildren(JComponent.java:889) at javax.swing.JComponent.paintToOffscreen(JComponent.java:5217) at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:290) at javax.swing.RepaintManager.paint(RepaintManager.java:1272) at javax.swing.JComponent.paint(JComponent.java:1042) at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39) at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79) at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116) at java.awt.Container.paint(Container.java:1975) at java.awt.Window.paint(Window.java:3912) at javax.swing.RepaintManager$4.run(RepaintManager.java:842) at javax.swing.RepaintManager$4.run(RepaintManager.java:814) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789) at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738) at javax.swing.RepaintManager.access$1200(RepaintManager.java:64) at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

ソースコード

package myrpg.main; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.io.*; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; enum Angle { UP, RIGHT, LEFT, DOWN } public class MyGUI extends JPanel implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener { Angle playerAngle; BufferedImage playerimg; int playerx = 32 * 3, playery = 32 * 3; public static void main( String[] args ) { // FileIO.imageChange( new File( "img/char_p_hero01.png" ) ); // FileIO.imageChange( new File( "img/b_attack01.png" ) ); new MyGUI(); } public MyGUI() { playerAngle = Angle.DOWN; try{ // playerimg = ImageIO.read( new ByteArrayInputStream( FileIO.changeRBI( new File( "img/char_p_hero01.rbi" ) ) ) ); playerimg = ImageIO.read( new File( "img/char_p_hero01.png" ) ); // ImageIO.read( new ByteArrayInputStream( FileIO.changeRBI( new File( "img/b_attack01.rbi" ) ) ) ); }catch( IOException ie ){ ie.printStackTrace(); } setBackground( new Color( 0xff000000, true ) ); JFrame jf = new JFrame( "MyRPG" ); jf.getContentPane().setPreferredSize( new Dimension( 640, 480 ) ); jf.pack(); jf.setLocationRelativeTo( null ); jf.setDefaultCloseOperation( 3 ); jf.setResizable( false ); jf.setFocusable( true ); jf.add( this ); jf.setVisible( true ); addKeyListener( this ); addMouseListener( this ); addMouseMotionListener( this ); addMouseWheelListener( this ); } @Override protected void paintComponent( Graphics g ) { super.paintComponent( g ); requestFocusInWindow(); int x = 1, y = 0; int width = 24, height = 32; if( playerAngle == Angle.UP ) y = 0; if( playerAngle == Angle.RIGHT ) y = 1; if( playerAngle == Angle.LEFT ) y = 2; if( playerAngle == Angle.DOWN ) y = 3; playerimg = playerimg.getSubimage( x * width, y * height, width, height ); g.drawImage( playerimg, playerx, playery, null ); } @Override public void keyPressed( KeyEvent e ) { if( e.getKeyCode() == KeyEvent.VK_UP ){ playery -= 32; playerAngle = Angle.UP; }if( e.getKeyCode() == KeyEvent.VK_RIGHT ){ playerx += 32; playerAngle = Angle.RIGHT; }if( e.getKeyCode() == KeyEvent.VK_LEFT ){ playerx -= 32; playerAngle = Angle.LEFT; }if( e.getKeyCode() == KeyEvent.VK_DOWN ){ playery += 32; playerAngle = Angle.DOWN; } repaint(); } @Override public void keyReleased( KeyEvent e ){} @Override public void keyTyped( KeyEvent e ){} @Override public void mouseClicked( MouseEvent e ){} @Override public void mouseEntered( MouseEvent e ){} @Override public void mouseExited( MouseEvent e ){} @Override public void mousePressed( MouseEvent e ){} @Override public void mouseReleased( MouseEvent e ){} @Override public void mouseDragged( MouseEvent e ){} @Override public void mouseMoved( MouseEvent e ){} @Override public void mouseWheelMoved( MouseWheelEvent e ){} }

発生しているエラーの種類で調べた結果、
・画像を大きくするとエラーが出なくなる
・横幅とX座標を足した時画像より大きくないか調べる
ということがわかりました。
前者の場合、画像ファイルを多数使用する予定があるため、極力大きくなるのは避けたいのです。
後者の場合、画像は288256なのですが、
横は 24
1 + 24 は48で問題なし、
縦は 320 + 32 <= image <= 323 + 32 で問題なしな計算なのです。

なぜこのエラーが発生するのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Java

@Override protected void paintComponent( Graphics g )
{
...
playerimg = playerimg.getSubimage( x * width, y * height, width, height );
g.drawImage( playerimg, playerx, playery, null );
}

paintComponentが働く度に、playerimgが小さくなっているように思えます。
次のように、新たなオブジェクトを用意してやれば良いのでは。

Java

1BufferedImage img = playerimg.getSubimage( x * width, y * height, width, height ); 2g.drawImage( img, playerx, playery, null );

投稿2019/01/07 08:37

LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkuri

2019/01/07 08:43

ありがとうございます!実際に小さくなってエラーが起こっていたようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問