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

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

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

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

Swing

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

Q&A

解決済

2回答

1543閲覧

java Swingにて、画像分割した際に画像が見切れてしまう。

sosoooooo3

総合スコア2

Java

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

Swing

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

0グッド

0クリップ

投稿2021/07/29 09:22

前提・実現したいこと

Swingにて、神経衰弱を作成する課題を現在行っているのですが、
画像サイズ:1480 x 748の画像を5行13列で分割したいのですが、キングが表示されず
縦も少し見切れてしまっている状態です。(添付画像の状態)
イメージ説明

この画像を使って、画像をシャッフルしたり・ゲーム開始時は裏面だけを表示したりする
処理を追加していきたいため、ちゃんと画像を分割したいのですが元画像の大きさを変更してみても変わりませんでした。
記載しているコードがおかしいのかも判断できないため、お手数ですが、ご教示いただけますと幸いです。

発生している問題・エラーメッセージ

エラーはなし

該当のソースコード

java

1import java.awt.Graphics; 2 3import javax.swing.JFrame; 4 5public class Pair_matching extends JFrame{ 6 CARD card; 7 8 // CARDのシャッフル、0x100:裏、0x200:非表示 9 int T[] = new int[52]; 10 11 public static void main(String[] args) { 12 new Pair_matching(); 13 } 14 15 public Pair_matching() { 16 super("神経衰弱"); 17 card = new CARD("card52.png", 106, 148); 18 setBounds(10, 10, 1550, 950); 19 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 20 setVisible(true); 21 } 22 23 // Paint Method 24 public void paint(Graphics g) { 25 super.paint(g); 26 for(int i=0; i<5; i++) { 27 for(int j=0; j<13; j++) { 28 card.view(g,i*13+j,j*106+20,i*150+46); 29 } 30 } 31 } 32}

java

1import java.awt.Graphics; 2import java.awt.Image; 3import java.io.File; 4import java.io.IOException; 5import java.util.Random; 6 7import javax.imageio.ImageIO; 8import javax.swing.JFrame; 9 10public class CARD extends JFrame{ 11 private Image img; 12 private int Height, Width, Hnum, Wnum; 13 int frameNum; 14 Random rand; 15 16 public CARD(String filename, int ws, int hs) { 17 Width= ws; 18 Height= hs; 19 Wnum=Hnum= 1; 20 // 画像のロード 21 File infile = new File(filename); 22 img = loadImage(infile); 23 Wnum = img.getWidth(null)/Width; 24 Hnum = img.getHeight(null)/Height; 25 frameNum = Wnum*Hnum; 26 if(Wnum<1 || Hnum<1 ) { 27 System.out.println("Image File Error"); 28 rand = new Random(); // 乱数の初期化 29 } 30 } 31 32 // Sprit View 33 public void view(Graphics g, int n, int dx, int dy) { 34 int sx, sy; 35 if(n >= frameNum) { 36 System.out.println("Sprite Number Error"); 37 return; 38 } 39 sx = (n % Wnum) * Width; 40 sy = (n / Wnum) * Height; 41 if(img != null) { 42 g.drawImage(img, dx, dy, dx+Width, dy+Height, sx, sy, sx+Width, sy+Height, this); 43 } 44 } 45 46 // Load Image 47 public static Image loadImage(File infile) { 48 try { 49 Image img = ImageIO.read(infile); 50 return img; 51 }catch(IOException e) { 52 throw new RuntimeException(e); 53 } 54 } 55}

試したこと

画像自体が大きい過ぎるのかと思い、サイズ変更してみましたが変わりませんでした。

補足情報(FW/ツールのバージョンなど)

Eclipse:Version: 2021-06 (4.20.0)

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

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

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

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

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

jimbe

2021/07/29 10:58

なぜ CARD クラスは JFrame を継承しているのでしょう。
guest

回答2

0

ベストアンサー

drawImage のパラメータである各座標値をカード毎に表示してみて、カード画像内の各位置とあっているかを確認されては如何でしょうか。


106等の数値を直接指定するのではなく、画像が正しく作られている前提で、各イメージの大きさを求める風にしては如何でしょう。

java

1import java.awt.Graphics; 2import java.awt.Image; 3import java.awt.image.ImageObserver; 4import java.io.File; 5import java.io.IOException; 6 7import javax.imageio.ImageIO; 8import javax.swing.JFrame; 9 10public class ConcentrationFrame extends JFrame { 11 12 public static void main(String[] args) throws IOException { 13 new ConcentrationFrame().setVisible(true); 14 } 15 16 private CardsImage cardsImage; 17 18 public ConcentrationFrame() throws IOException { 19 super("神経衰弱"); 20 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21 setBounds(10, 10, 1550, 950); 22 23 cardsImage = new CardsImage("card52.png"); 24 } 25 26 public void paint(Graphics g) { 27 super.paint(g); 28 for(int i=0; i<13*4+1; i++) { 29 int x = (i%13) * cardsImage.getCardWidth() + 20; 30 int y = (i/13) * cardsImage.getCardHeight() + 46; 31 cardsImage.drawCard(g, i, x, y, this); 32 } 33 } 34 35 private static class CardsImage { 36 private Image img; 37 private int height, width; 38 39 public CardsImage(String filename) throws IOException { 40 img = ImageIO.read(new File(filename)); //画像のロード 41 width = img.getWidth(null) / 13; 42 height = img.getHeight(null) / 5; 43 } 44 45 public void drawCard(Graphics g, int n, int dx, int dy, ImageObserver observer) { 46 if(img == null) throw new IllegalStateException("image nothing."); 47 if(n >= 13*4+1) throw new IllegalArgumentException("Number Error"); 48 49 int sx = (n % 13) * width; 50 int sy = (n / 13) * height; 51 g.drawImage(img, dx, dy, dx+width, dy+height, sx, sy, sx+width, sy+height, observer); 52 } 53 public int getCardWidth() { return width; } 54 public int getCardHeight() { return height; } 55 } 56}

投稿2021/07/29 11:22

編集2021/07/29 11:51
jimbe

総合スコア12646

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

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

0

1480 x 748の画像を5行13列で分割したい

縦も横も割り切れなくないですか?
まあ割り切れなきゃダメというわけでもないでしょうが、intで計算していると誤差がたまりそうな気がします。

元画像がわからないので何とも言えませんが、106とかの根拠は何でしょう?(1480/13とはだいぶ乖離がありますが)

Java

1g.drawImage(img, dx, dy, dx + Width, dy + Height, sx, sy, sx + Width, sy + Height, null); 2g.drawRect(dx, dy, Width, Height);

とかでどこに何を描いているかを見えるようにすると、わかりやすくなるかもしれません。

あるいは BufferedImage#getSubimage で、1枚ずつ切ってしまったほうが楽な気もします。

投稿2021/07/29 11:04

TN8001

総合スコア9321

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

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

sosoooooo3

2021/07/29 11:35 編集

ご回答いただきありがとうございます。 > 元画像がわからないので何とも言えませんが、106とかの根拠は何でしょう?(1480/13とはだいぶ乖離がありますが) 上記ですが、参考にしていたサイトが画像内のカードのサイズを記載していたため、 「1480 x 748」のサイズ内にあるトランプ1枚分の大きさをフォトショップ等でサイズを測って記載しました。(参考サイトの画像の大きさがどのくらいかは記載がなかったので、わかりかねます。すみません) > あるいは BufferedImage#getSubimage で、1枚ずつ切ってしまったほうが楽な気もします。 この記述は試していないため、試したいと思います。
TN8001

2021/07/29 11:44

まずはdrawRectを試してみてください。 要は「切り出し位置を間違っているのでは?」と思っています。 全部並べてしまうと一見うまくいっているように見えてしまうので、例えばハートの10だけ出すとかもいいかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問