0

画面上の個別のキャンバスに、関連するグラフのペアを生成するコードがあります。これらの両方の画像を別々のファイルに保存したいと思います。しかし、同じコマンドを使用してそれらを保存すると、一方は正しく保存され、もう一方は空白の画像 (背景色のみ) として保存されます。

キャンバスには 1 つの違いがあります。1 つは単純に描画されるもので、もう 1 つはオフスクリーンに関連付けられたバッファリングされたイメージがあるため、マウスで線をドラッグできます。

このバッファリングされた配置を設定するためのコードは次のとおりです。

public class VolCanvas extends Canvas
{

   volCnv.createBufferStrategy(2);
   offScreen = volCnv.getBufferStrategy();
   if (offScreen != null) ofsg = (Graphics2D) offScreen.getDrawGraphics();


  // carry out draw operations with ofsg
   .
   .
   .   

   ofsg.dispose();
   offscreen.show();
}

次に、ファイルに保存する前に、関数を使用してキャンバスから画像への変換を行います

private BufferedImage canvasToImage(Canvas cnvs)
{
   int w = cnvs.getWidth();
   int h = cnvs.getHeight();
   int type = BufferedImage.TYPE_INT_RGB;
   BufferedImage image = new BufferedImage(w,h,type);
   Graphics2D g2 = image.createGraphics();
   cnvs.paint(g2);
   g2.dispose();
   return image;
 }//canvasToImage

最後に、以下に示す ActionListener で保存を行います。

public class SaveChart implements ActionListener
{
   public void actionPerformed(ActionEvent evt)
   {
      File outFile;
      String outDirName = "", fileName;
      BufferedImage outImage;

      outImage = canvasToImage(graphCnv); 
      outDirName = Global.directory + "images/";
      outFile = new File(outDirName);
      fileDlgBox.setCurrentDirectory(outFile);    //setting the target directory
      fileDlgBox.showSaveDialog(null);
      outFile = fileDlgBox.getSelectedFile();
      try
      {
         ImageIO.write(outImage, "PNG", outFile);
      }
      catch(IOException ioe){}

      outImage = canvasToImage(volCnv);
      fileName = outFile.getName();
      fileName = outDirName + fileName + "_vol";
      outFile = new File(fileName);
     try
     {
        ImageIO.write(outImage, "PNG", outFile);
     }
     catch(IOException ioe){}
  }//actionPerformed
}//SaveChart

この最後のコードに関して、最初の保存は完全に機能し、それに関連するキャンバスは単なるキャンバスでした。2 番目の保存は、前述のように誤動作します。これは、オフスクリーン コンポーネントで使用されるキャンバスです。

この質問が長くなって申し訳ありませんが、人々は通常、関連するすべてのコードを見たいと思っているので、ここにあります。

この謎についての洞察を事前に感謝します。

ジョン・ドナー

4

1 に答える 1

5

このコードを試してください

public void Crear_Imagen(Image image)
{
    try 
    {
        BufferedImage bi = (BufferedImage) image;
        File outputfile = new File("name.png");
        ImageIO.write(bi, "png", outputfile);
    } catch (IOException e) 
    {
    }
}
于 2011-08-06T04:52:15.410 に答える