画面上の個別のキャンバスに、関連するグラフのペアを生成するコードがあります。これらの両方の画像を別々のファイルに保存したいと思います。しかし、同じコマンドを使用してそれらを保存すると、一方は正しく保存され、もう一方は空白の画像 (背景色のみ) として保存されます。
キャンバスには 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 番目の保存は、前述のように誤動作します。これは、オフスクリーン コンポーネントで使用されるキャンバスです。
この質問が長くなって申し訳ありませんが、人々は通常、関連するすべてのコードを見たいと思っているので、ここにあります。
この謎についての洞察を事前に感謝します。
ジョン・ドナー