Java BufferedImageの問題と解決方法

このQ&Aのポイント
  • Java BufferedImageを使用して画像に文字列を重ねるツールを作成しているが、元の画像が表示されてしまう問題が発生している。
  • 問題の原因は、新しい画像を作成する際にグラフィックス2Dオブジェクトを使用していないため、追加した要素が反映されない。
  • 解決方法は、画像を作成する際にグラフィックス2Dオブジェクトを使用して要素を追加し、再描画することで解決できる。
回答を見る
  • ベストアンサー

Java BufferedImage

こんにちは。趣味でプログラミングをしている者です。 さっそくですが質問させていただきます。 JFileChooser から gif ファイルを取得し その画像上に文字列を重ねるようなツールのようなものを 作っているのですが、 加工された状態の画像を表示したいのですが、 もとの画像が表示されてしまいます。 以下のコードをみていただいて、どこが悪いのか 教えていただけないでしょうか? よろしくお願いします。 import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.io.*; import javax.imageio.ImageIO; import javax.swing.*; import javax.swing.filechooser.*; class DrawPanel extends JPanel implements ActionListener { JButton btOpen; JButton btSave; JFileChooser chooser; FileNameExtensionFilter filter01; FileNameExtensionFilter filter02; BufferedImage newImage; DrawPanel() { super(); setLayout( null ); setPreferredSize( new Dimension( 200, 240 )); setBackground( new Color( 220,240, 230 )); btOpen = new JButton( "open"); btSave = new JButton( "save"); btOpen.addActionListener( this ); btSave.addActionListener( this ); add( btOpen ); add( btSave ); btOpen.setBounds( 0,0, 100,40 ); btSave.setBounds( 100,0, 100, 40 ); chooser = new JFileChooser(); filter01 = new FileNameExtensionFilter( "gif files", "gif" ); filter02 = new FileNameExtensionFilter( "jpg files", "jpg" ); chooser.setFileFilter( filter01 ); chooser.addChoosableFileFilter( filter02 ); newImage = null; } public void actionPerformed( ActionEvent ae01 ) { if( ae01.getSource() == btOpen ) { int retvalue = chooser.showOpenDialog( null ); if( retvalue == JFileChooser.APPROVE_OPTION ) { String filename = (String) chooser.getSelectedFile().getAbsolutePath(); try { newImage = ImageIO.read( new File( filename ) ); } catch( Exception e01 ) { e01.printStackTrace(); newImage = null; } // (a) if( newImage != null) { Graphics2D g2D = newImage.createGraphics(); g2D.setColor( Color.red ); Font font01 = new Font( "Monospaced", Font.ITALIC, 18 ); g2D.setFont( font01 ); g2D.drawString( "AC", 5, 5 ); } // (a) の終わり repaint(); } } } public void paintComponent( Graphics g ) { super.paintComponent(g); Graphics2D drawG2D = (Graphics2D) g; if( newImage == null ) { drawG2D.setColor( Color.green ); drawG2D.fillRect( 15, 50, 55, 70 ); } else { drawG2D.drawImage( newImage, 15, 50, this ); } } } ------------------------------------------------------ class test03 extends JFrame { DrawPanel dp01; test03() { super("filedialog test"); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); dp01 = new DrawPanel(); add( dp01 ); setResizable( false ); setLocation( 170,300 ); pack(); setVisible( true ); } public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ new test03(); } } ------------------------------------------- (a) のところが悪いのだと思うのですが どのようにしたらよいのかわかりません 長文になり申しわけありませんが、 よろしくお願いします。

noname#173931
noname#173931
  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.3

 #1です。  試してみました。  青っぽいボタンの画像でいいんですか?  まあ、青い背景に赤い文字がデザイン的にどうか?と言う問題はおいておくとしても、ちゃんと、赤い文字が表示されます。  プログラムされたとおりに動いているように見えます。  どういう結果を望んでおられるのか、ちょっとよくわからないですね。

noname#173931
質問者

お礼

さっそく試行していただきありがとうございます。 そうですか。 自分の環境では、灰色っぽいというか、黒っぽい色で 文字列が描画されてしまうので、 失礼ながらも確認していただけたら、と思ってしまいました。 ですが、白色なら描画できるので、 しばらく、白色で描画しようか、と思います。 貴重な時間をさいてのかいとう、ありがとうございました。

その他の回答 (2)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 #1です。  私の環境では、普通に赤色が出ていますが、どういうことでしょうねぇ。  ただ単に、背景となる元画像の色とのかねあいではっきり見えないと言うことでしょうか?

noname#173931
質問者

お礼

さっそく答えていただきありがとうございます。 そうですか、きちんと表示されていますか・・・ おそれいりますが、暇なときにでも 以下のサイトのページにある 上から7番目か8番目のボタンで 赤色が表示されるか試してみて結果を 教えていただけないでしょうか? 無料素材屋 素材屋いわのり http://ameblo.jp/lab-iwanori/entry-10815998953.html 自分はもう寝ますので、暇なときで結構です。 よろしくおねがいします。 とにかく、貴重な時間をさいての回答、ありがとうございました。

noname#173931
質問者

補足

すいません、補足させていただきます。 下のサイトからファイルを入手していただけたら、 55×70にリサイズしていただき、 gif 形式で保存していただけたら、と思います。 それでは、よろしくお願いします。

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。  実行してみましたが、ちゃんと加工済みの物が表示されますよ。  まあ、やや、文字が上すぎるかなぁと思いますが。 (drawString の引数 x, yは、表示される文字のベースラインであるため)

noname#173931
質問者

お礼

さっそく回答していただきありがとうございます。 たしかに、追加する文字列の座標を変えたら 文字は確認できました。 おそれいりますが、もう少し教えていただきたいのですが、 (a) の g2D.setColor( Color.red ) についてなのですが、 加工した画像では赤の色が反映されていなくて、 Color.white では、くっきりと文字列が見えますが、 それ以外ではだめなように思います。 どのようにすれば、指定した色がはっきりと 表示されるようになるか、 ご存知であれば、教えていただけないでしょうか? よろしくお願いします。

関連するQ&A

  • javaにおいてコンパイルをすると次のようなエラーが出てきます。

    javaにおいてコンパイルをすると次のようなエラーが出てきます。 力不足で解決することができません。 どうか力を貸してください。 エラーは以下のように出てきます。 よろしくお願いします。 シンボルがみつかりません シンボル: コンストラクタ DrawPanelMouseHandler(DrawPanel) 場所 : DrawPanelMouseHandler の クラス mouseHandler = new DrawPanelMouseHandler(this); mouseHandler = new DrawPanelMouseHandler(this);import java.awt.*; import java.util.ArrayList; import javax.swing.JPanel; import javax.swing.JButton; public class DrawPanel extends JPanel { ArrayList<Shape> shapeList = new ArrayList<Shape>(); DrawPanelMouseHandler mouseHandler; public void paintComponent(Graphics g) { super.paintComponent(g); for(Shape shape: shapeList){ shape.draw(g); } } public DrawPanel(){ mouseHandler = new DrawPanelMouseHandler(this); this.addMouseListener(mouseHandler); this.addMouseMotionListener(mouseHandler); ShapeFactory circleFactory = new CircleFactory(); UIToolButton circleButton = new UIToolButton(circleFactory, this, "Circle"); this.add(circleButton); } public void addShape(Shape s) { shapeList.add(s); repaint(); } } import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class UIToolButton extends JButton implements ActionListener{ DrawPanelMouseHandler mouseHandler; ShapeFactory factory; public UIToolButton(ShapeFactory factory, DrawPanelMouseHandler mouseHandler, String text) { super(text); this.addActionListener(this); this.mouseHandler = mouseHandler; this.factory = factory; } public void actionPerformed (ActionEvent ae) { mouseHandler.setShapeFactory(factory); } }

  • javaでgraphicsの描画の件

    今日は javaでgraphicsの描画を行っていますが、CENTERのペインには、描画できますが、 それ以外のペイン(NORTH,WEST、EAST,、SOUTH)には、描画できないように思います。 Q1)この件について、コメント頂けますと大変助かります。 下記に、ソースコードを添付いたします。 =================== package pkg; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JPanel; public class SampleApp extends JFrame { public SampleApp(){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(600, 300); this.add(new GPanel(), BorderLayout.WEST); this.add(new GPanel(), BorderLayout.CENTER); } public static void main(String[] args) { new SampleApp().setVisible(true); } } class GPanel extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); // int w = this.getWidth(); // int h = this.getHeight(); int w=200; int h=200; g.setColor(Color.RED); g.fillOval(0, 0, w/2, h/2); Graphics2D g2 = (Graphics2D)g; g2.draw(new Line2D.Double(40, 40, w,h)); g.setColor(Color.BLUE); g.setFont(new Font("Serif", Font.BOLD, 36)); g.drawString("Graphics draw!", 10, h - 50); // g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.draw(new Line2D.Double(30.0d, 50.0d, 180.0d, 140.0d)); g2.setPaint(Color.PINK); BasicStroke wideStroke = new BasicStroke(8.0f); g2.setStroke(wideStroke); g2.draw(new Line2D.Double(30.0d, 120.0d, 250.0d, 70.0d)); } }

    • ベストアンサー
    • Java
  • JAVAでの背景画像表示

    現在javaでゲームのメニュー画面を作っているのですが、ボタンを配置する所まではできたんですが、背景に画像を表示することができなくて困っています! import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.border.LineBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.Container; public class Mati extends JFrame{ public static void main(String[] args){ Mati frame = new Mati(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10,650,650); frame.setTitle("街"); frame.setVisible(true); JPanel h = new JPanel(); h.setOpaque(false); ImageIcon icon1 = new ImageIcon("Mati.jpg"); JLabel label1 = new JLabel(icon1); JLabel label2 = new JLabel(); h.add(label1); } Mati(){ JButton button1 = new JButton("宿屋"); button1.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button2 = new JButton("道具屋"); button2.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button3 = new JButton("武器屋"); button3.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button4 = new JButton("街を出る"); button4.setFont(new Font("Mairyo", Font.PLAIN, 30)); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(Box.createRigidArea(new Dimension(10,30))); p.add(button1); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button2); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button3); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button4); getContentPane().add(p, BorderLayout.CENTER); } } ソースはこのようになっています。これからどうすれば背景画像が表示されるか教えていただきたいです。 よろしくお願いします。

  • javaの画像の表示のプログラムとmouselistenerのプログラ

    javaの画像の表示のプログラムとmouselistenerのプログラム(それぞれ↓にあります)をひとつに合わせたいのですがどうすればいいでしょうか? import java.awt.event.*; import javax.swing.*; class MyPanel extends JPanel implements MouseListener{ public MyPanel() { addMouseListener(this); } public void mouseClicked(MouseEvent e) { int x=e.getX(); int y=e.getY(); System.out.println("マウスがクリックされました (" + e.getX() + ", " + e.getY() + ")"); if((x<100&&x>40)&&(y<100&&y>40)){ System.out.println("範囲内"); }else{ System.out.println("aaa"); } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } } public class MouseEventExample extends JFrame { public static void main(String[] args) { new MouseEventExample(); } MouseEventExample() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().add(new MyPanel()); setSize(300, 200); setVisible(true); } } ======↑のプログラムと↓のプログラムを合わせたいのです package novel; import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import javax.swing.*; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; public class Java2dTest extends JFrame{ public static void main(String[] args){ Java2dTest test = new Java2dTest(); test.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){System.exit(0);} }); test.setBounds( 0, 0, 200, 200); test.setVisible(true); } public void paint(Graphics g){ Graphics2D g2 = (Graphics2D)g; BufferedImage readImage = null; try { readImage = ImageIO.read(new File("sample.png")); } catch (Exception e) { e.printStackTrace(); readImage = null; } if (readImage != null){ g2.drawImage(readImage, 0, 0, this); } } }

  • Java JFileChooser

    こんにちは。趣味でプログラミングをしているものです。 さっそくですが、質問させていただきます。 まず、以下のコードをみていただきたいのですが・・・ public class test03 extends JFrame { DrawPanel dp01; test03() { super("filedialog test"); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); dp01 = new DrawPanel(); add( dp01 ); setResizable( false ); setLocation( 170,300 ); pack(); setVisible( true ); } /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ new test03(); } } -------------------------------------------------------- class DrawPanel extends JPanel implements ActionListener { JButton btOpen; JButton btSave; DrawPanel() { super(); setLayout( null ); setPreferredSize( new Dimension( 200, 240 )); setBackground( new Color( 220,240, 230 )); btOpen = new JButton( "open"); btSave = new JButton( "save"); btOpen.addActionListener( this ); btSave.addActionListener( this ); add( btOpen ); add( btSave ); btOpen.setBounds( 0,0, 100,40 ); btSave.setBounds( 100,0, 100, 40 ); } public void actionPerformed( ActionEvent ae01 ) { if( ae01.getSource() == btOpen ) { JFileChooser jfc = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter( "jpg and gif files","jpg","gif"); jfc.setFileFilter( filter ); int retvalue = jfc.showOpenDialog( null ); if( retvalue == JFileChooser.APPROVE_OPTION ) { //System.out.println( "you choosed a file : "); System.out.println( jfc.getCurrentDirectory().getName() ); System.out.println( jfc.getSelectedFile().getName() ); System.out.println( jfc.getSelectedFile().getAbsolutePath()); } } } } DrawPanel クラスの中の FileNameExtensionFilter についてなのですが、 コンストラクタの引数をこのように指定すると、 jpg と gif のファイルが同時にフィルターされ抽出されるのですが、 Windows7 に標準で付属しているペイントだと、 拡張子一種類ずつのファイルがフィルターにより抽出されます。 JFileChooser を用いても、ペイントのようなファイルの フィルタリングはできるものでしょうか? ご存知のかた、教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • repaint()が実行されません。

    repaint()が実行されません。 もともとあるJEditorPane上に画像表示させるために、他のクラスからrepaint()をよびだしてpaint()を実行させようとしているのですが、実行されません……。 以下にプログラムを表示します。 import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; public class Open extends JFrame {   public Open(){   }    public void paint(Graphics g){    System.out.println("paint開始");    Graphics2D g2 = (Graphics2D)g;    BufferedImage readImage = null;    try {    readImage = ImageIO.read(new File("sample.png"));    } catch (Exception e) {    e.printStackTrace();    readImage = null;    }      if (readImage != null){    g2.drawImage(readImage, 0, 0, this);    }    }    public void Fileload(){    System.out.println("再描写");    repaint();   } } 外部のクラスからFileload()を呼び出して実行すると"再描写"はコマンドプロンプト上に表示されるのですが"paint開始"は表示されません。なのでpaint()の呼び出しができていないのだと思うのですが……。 原因がわかりません……。 javaも質問も初心者なのでわかりづらいところがあるとは思いますが、どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • javaでスタート画面を作っていて困っています。

    現在javaでゲームのスタート画面を作っているのですが、パネルが透過されずに困っています。 プログラムソースは import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.*; import java.awt.Font; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.border.LineBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.Container; class Start最新版 extends JFrame{ public static void main(String args[]){ Start最新版 frame = new Start最新版("タイトル"); frame.setVisible(true); } Start最新版(String title){ setTitle(title); setBounds(10, 10, 1024, 768); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setOpaque( false ); ImageIcon icon1 = new ImageIcon("Start.jpg"); JLabel label1 = new JLabel(icon1); JLabel label2 = new JLabel(); p.add(label1); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); JButton button1 = new JButton("ゲームを始める"); button1.setFont(new Font("Mairyo", Font.PLAIN, 30)); JPanel n = new JPanel(); n.setOpaque(false); n.setLayout(new BoxLayout(n, BoxLayout.Y_AXIS)); n.add(Box.createRigidArea(new Dimension(290,30))); n.add(button1); となっています。「ゲームを始める」ボタンだけを残して、周りのパネルを透過して画像を表示させたいのですが、うまくいきません!解決方法をご存知の方どうか教えていただきたいです!よろしくお願いします。

  • javaについて質問

    import javax.swing.*; import java.awt.Color; import java.awt.Graphics; import java.awt.event.*; public class tt extends JFrame { public tt(){ setTitle("hogehoge"); setBounds( 10, 10, 300, 200); JButton btn1 = new JButton("続ける"); final JPanel p = new JPanel(); p.setBackground(Color.white); btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event){ } } ); p.add(btn1); getContentPane().add(p); } public static void main(String[] args){ tt test = new tt(); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); /* 実際に表示する */ } } Graphics g; g.drawString("ほげさんじょう",130,120);を追加しても コンパイルが通りません。 どうすれば画面に文字列を表示するんですか? あとテキストフィールドを追加するさいに、座標していとかして追加できないんですか?

  • 任意の文字列をJAVAで画像化

    表題にある通り任意の文字列をJAVAで画像化したいと思い 下記サンプルを検索して見つけたのですが作成される画像は 真っ白な画像で文字列は表示されませんでした。 任意の文字列を画像として出力するにはどうすればよいでしょうか。 import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class Test5 { public static void main(String[] args) { String str = "abc123"; new Test5().Create(str); System.out.println(str); } public void Create(String str) { int w=60; int h=17; try { //受け取った文字列を画像化 BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB); Graphics2D g2d=image.createGraphics(); g2d.setBackground(Color.WHITE); g2d.clearRect(0,0,w,h); g2d.setColor(Color.BLACK); g2d.drawString(str,0,0); ImageIO.write(image, "JPEG", new File("c:\\test.jpg")); } catch(Exception e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • javaのBoxlayoutについて

    下記はBoxLayout用ののコードです。 Q1)Buttonのサイズを設定する方法がありますか? Q2)Buttonの配置を設定する方法がありますか? //===================================== import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.LayoutManager; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class AlignmentX extends JFrame{ JButton button1; JButton button2; JButton button3; public static void main(String[] args){ AlignmentX frame = new AlignmentX(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("タイトル"); frame.setVisible(true); } AlignmentX(){ button1 = new JButton("AAAAA"); button1.setAlignmentY(0.5f); button1.setPreferredSize(new Dimension(80,20)); button2 = new JButton("BBB"); button2.setAlignmentY(0.5f); button2.setPreferredSize(new Dimension(80,20)); button3 = new JButton("CC"); button3.setAlignmentY(0.5f); button3.setPreferredSize(new Dimension(80,20)); JPanel p = new JPanel(); p.setLayout((LayoutManager) new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(button1); p.add(button2); p.add(button3); getContentPane().add(p, BorderLayout.CENTER); setBounds(10, 10, 300, 200); } } //以上,宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう