1

Image を BufferedImage に読み込み、JFrame にペイントし、円をペイントし、File に書き込むプログラムをコーディングしようとしています。

次のコードは、保存されたファイルの内容を除くすべてを実行します。保存された画像には、そのままの BufferedImage のみが含まれます。円はありません ;) コードを変更したり追加したりして、すでに解決しようとしましたが、あまり役に立ちませんでした。

public class PaintImage extends Component {

BufferedImage img;
private int pngWidth, pngHeight;

public int getPngWidth() {
    return pngWidth;
}

public int getPngHeight() {
    return pngHeight;
}

public void paint(Graphics g) {
    super.paint(g);

 //g = img.createGraphics();
 g.drawImage(img, 0, 0, 809, 1080, null);
 g.drawOval(33, 33, 444, 444);
}

public PaintImage() {
try {
    img = ImageIO.read(new File("C:\\karte_vorlage.png"));
    pngWidth = img.getWidth();
    pngHeight = img.getHeight();

} catch (IOException e) {
}
}

public void writeImage () {
    try {
     img.getGraphics();
        ImageIO.write(img, "png", new File("C:\\save.png"));
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}


}

g = img.createGraphics(); のコメントを外します。歪んだイメージを引き起こします。

私を助けてください。よろしくお願いします。

edit: 1. メソッド paint(Graphics g) が 2 回呼び出されます。最小化の場合、再度 2 回呼び出されます。

4

3 に答える 3

2

コンポーネントを直接BufferedImage

BufferedImage tempImage = new BufferedImage(imagePane.getWidth(), imagePane.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g = tempImage.createGraphics();

imagePane.printAll(g);

ImageIO.write(tempImage, "png", new File("C:\\save.png"));

ただし、幅と高さをいじって、要件をより適切に満たすことができます

更新しました

これについて考え続けてください。

もう 1 つのアイデアは、ある種の「ペイント マネージャー」または「ペイント可能な」インターフェイスを作成することです。これは、特定のコンテンツがそれ自体をペイントできるものです (明らかに、 &Graphicsなどの詳細情報を知りたいと思います) 。widthheight

これは、それがどこに描かれているかは問題ではないことを意味します。

paintableもう 1 つは、 をどのようにペイントしたいか (優先サイズなど)についてレンダラーにヒントを提供したい場合です。

ただのアイデア

于 2012-08-15T10:28:30.270 に答える
0

デザインを変更する必要があります。この方法を試してください:

  1. pngファイルを読み取り、bufferedImageに保存します。
  2. paint()メソッドを変更します(追加の要素を持つ新しい画像が必要なため、これは非常に重要ですが、コードは最初にpngを描画し、次にUIに楕円を描画することを意味します)。bufferedImageは変更されません。独自のイベントを追加して、bufferedImageを変更します。たとえば、ボタンをクリックすると、次のようなメソッドが実行されます。

void foo(bufferedImage){

    g = bufferedImage.getGraphis();
    g.drawSomething();
}
public void paint(Graphics g) {
    g.drawImage(bufferedImage);
}
于 2012-08-15T12:12:02.443 に答える
0

別の方法で画像に円を描きます。この他のメソッドはいつでも呼び出すことができます。次に、paint メソッドでコンポーネントに画像を描画するだけで、他には何も描画しません。

public void paint(Graphics g) {
    super.paint(g);
    g.drawImage(img, 0, 0, 809, 1080, null);
}

public void drawCircle() {
    Graphics g = img.getGraphics();
    g.drawOval(33, 33, 444, 444);
}

img.getGraphics(); を削除することもできます。そこでは必要ないため、writeImage メソッドから。

于 2012-08-15T09:17:56.023 に答える