2

フレームのサイズのバッファリングされた画像があります。

public BufferedImage img;
public static int WIDTH = 800;
public static int HEIGHT = 600;
img=new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);

フレームを塗りつぶす黒い画像だけが見えるように描画するにはどうすればよいですか? キャンバスを使用せずに

paint 関数や paintComponent 関数を使わずに、グラフィックから drawImage 関数だけを使いたい

可能であれば、その画像に 1D 配列 [WIDTH*HEIGHT] を割り当てるにはどうすればよいですか?

簡単に: 画像を作成し、値を配列からピクセル (0=black,999999999=lightblue など) に変換し、画面に描画します。

編集:

これは、期待どおりに動作しないコードです (黒い描画された画像が表示されたフレームである必要があります)。

ここに画像の説明を入力

  import javax.swing.*;

  import java.awt.Canvas;
  import java.awt.Graphics;
  import java.awt.image.BufferStrategy;
  import java.awt.image.BufferedImage;
  import java.awt.image.DataBufferInt;

  public class test extends Canvas{

public static JFrame frame;
public static int WIDTH = 800;
public static int HEIGHT = 600;

public test(){
    
}

public static void main(String[] a){
    
        test t=new test();
        frame = new JFrame("WINDOW");
        frame.add(t);
        frame.pack();
        frame.setVisible(true);
        frame.setSize(WIDTH, HEIGHT);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        t.start();
    
}

public void start(){
    
    BufferedImage img = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
    int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();
    boolean running=true;
    while(running){
        BufferStrategy bs=this.getBufferStrategy();
        if(bs==null){
            createBufferStrategy(4);
            return;
        }
        for (int i = 0; i < WIDTH * HEIGHT; i++)
            pixels[i] = 0;
        
        Graphics g= bs.getDrawGraphics();
        g.drawImage(img, 0, 0, WIDTH, HEIGHT, null);
        g.dispose();
        bs.show();
        
    }
}}
4

1 に答える 1

9

あなたが達成しようとしていることを私が理解している限り(これは「多くはない」)、これはあなたにいくつかのヒントを与えるかもしれません. フレームと画像の構成がまだ雑に見えますが、これを見てください。

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import javax.swing.*;

public class TestImageDraw {

    public static JFrame frame;
    BufferedImage img;
    public static int WIDTH = 800;
    public static int HEIGHT = 600;

    public TestImageDraw() {
    }

    public static void main(String[] a){

        TestImageDraw t=new TestImageDraw();

        frame = new JFrame("WINDOW");
        frame.setVisible(true);

        t.start();
        frame.add(new JLabel(new ImageIcon(t.getImage())));

        frame.pack();
//      frame.setSize(WIDTH, HEIGHT);
        // Better to DISPOSE than EXIT
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    public Image getImage() {
        return img;
    }

    public void start(){

        img = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
        int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();
        boolean running=true;
        while(running){
            BufferStrategy bs=frame.getBufferStrategy();
            if(bs==null){
                frame.createBufferStrategy(4);
                return;
            }
            for (int i = 0; i < WIDTH * HEIGHT; i++)
                pixels[i] = 0;

            Graphics g= bs.getDrawGraphics();
            g.drawImage(img, 0, 0, WIDTH, HEIGHT, null);
            g.dispose();
            bs.show();

        }
    }
}

一般的なヒント

  • コード ブロックには一貫性のある論理的なインデントを使用してください。
  • クラス、メソッド、および属性名の一般的なJava 命名規則(特に名前に使用されるケース) を学び、それを一貫して使用してください。
  • テスト クラスに意味のある名前を付けTestImageDrawます。
  • EDT で Swing GUI を作成および更新します。
  • 正当な理由がない限り、Swing と AWT のコンポーネントを混在させないでください。
于 2012-06-23T19:03:16.300 に答える