Java jPanel没有';有时无法显示完整的缓冲区图像
我正在尝试使用drawImage向jPanel(processedPanel)显示集群图像。 这是我的密码Java jPanel没有';有时无法显示完整的缓冲区图像,java,jpanel,bufferedimage,Java,Jpanel,Bufferedimage,我正在尝试使用drawImage向jPanel(processedPanel)显示集群图像。 这是我的密码 nt.setData(buff); nt.starting(); BufferedImage clusterizedImage = nt.getClusterizedImage(); Graphics g = processedPanel.getGraphics(); System.out.println(clusterizedImage.getWidth()+"-"+clusteriz
nt.setData(buff);
nt.starting();
BufferedImage clusterizedImage = nt.getClusterizedImage();
Graphics g = processedPanel.getGraphics();
System.out.println(clusterizedImage.getWidth()+"-"+clusterizedImage.getHeight());
g.drawImage(clusterizedImage, 0, 0, null);
try {
File outputfile = new File("check.png");
ImageIO.write(clusterizedImage, "png", outputfile);
} catch (IOException e) {
System.out.println("failed");
}
NetworkTester类
public class NetworkTester {
private BufferedImage testBuff;
private Vector<InputSet> testingData;
private double[] inputD;
private double output;
private BufferedImage buff;
private NeuralNetwork nnValue;
public void NetworkTester(){
nnValue = new NeuralNetwork();
}
public void setData(BufferedImage testBuff){
this.testBuff = testBuff;
}
public BufferedImage getClusterizedImage(){
return buff;
}
private void extract(){
int i,j;
int[] inputs;
System.out.println("Segmentation started");
int fff = 0;
SawitImage si = new SawitImage(200, 200);
BufferedImage inputImage = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
//si.setImage(testBuff);
for(i=0;i<200;i++){
for(j=0;j<200;j++){
si.setOutputPixel(i, j, testBuff.getRGB(i, j));
inputImage.setRGB(i, j, testBuff.getRGB(i,j));
//System.out.println(si.getOutputPixel(i, j));
}
}
si.setImage(inputImage);
//System.out.println(si.getWidth()+" - "+si.getHeight());
Segmentation pp = new Segmentation(si);
pp.rgbToLab();
pp.KMeans();
pp.index(pp.Kluster(pp.K1(pp.rgbToLab()), pp.K2(pp.rgbToLab()), pp.K3(pp.rgbToLab())));
buff = pp.theFruits();
if(fff == 0){
System.out.println("Feature Extraction started");
fff = 1;
}
HueFinder hf = new HueFinder();
hf.HueValue(buff);
HistogramHue hh = new HistogramHue();
hh.hueHistogram(hf.getHueValues());
inputs = hh.getH();
//System.out.println("Length : "+inputs.length);
//test image
try {
// retrieve image
File outputfile = new File("test_data.png");
ImageIO.write(buff, "png", outputfile);
} catch (IOException e) {
System.out.println("failed");
}
//end test image
System.out.println("Segmentation done!");
System.out.println("Feature Extraction done!");
double a;
InputSet tempInput = new InputSet("1");
testingData = new Vector<>();
for(i=0;i<inputs.length;i++){
a = inputs[i];
tempInput.addElement(a/360);
}
testingData.addElement(tempInput);
System.out.println("Input vector done!");
}
private void testStart(){
int i;
BPTester bp = new BPTester();
inputD = new double[testingData.get(0).size()];
for(i=0;i<testingData.get(0).size();i++){
inputD[i] = Double.parseDouble(testingData.get(0).get(i).toString());
bp.setInput(inputD[i], i);
}
bp.readWeight();
bp.operationOnHidden();
bp.operationOnOutput();
output = bp.getOutput();
}
public void starting(){
extract();
testStart();
}
public double getOutput(){
return output;
}
}
输出文件正常。没什么问题。问题是我的jPanel有时(不是每次)不会显示BuffereImage的所有像素
截图
我希望我的问题没有违反规则。你在哪里加载图像?它在哪个线程上运行?我有一个daemonthread,它会随着时间的推移替换我的buff。之后,我使用nt.setData将我的buff(它包含我的相机当前帧)发送到nt线程(我刚刚更新了代码)。然后,我使用getClustereImage()将图像取回。如果你能为这个bug创建一个脚本,你发布的小代码对我们检查bug是没有用的。目前,这个问题将以“主题外的代码为什么不工作?”结束。@Ferrybig我刚刚更新了我的代码,这不是你在JPanel上绘制的方式。您需要重写
paintComponent
方法。并确保重写方法的第一行调用super.paintComponent
。有关详细信息,请参见教程。(当然,您不需要自定义绘制;只需将图像放在ImageIcon中,然后在面板中放置一个使用该ImageIcon的JLabel。)
class DaemonThread implements Runnable{
protected volatile boolean runnable = false;
@Override
public void run(){
synchronized(this){
while(runnable){
buff = cap.getFrame();
Graphics g = videoPanel.getGraphics();
if(g.drawImage(buff, 0, 0, 200, 200, 0, 0, 200, 200, null)){
if(runnable == false){
System.out.println("Stopped");
}
}
}
}
}
}