クラス プロジェクトでは、スレッド化に慣れるための演習として、Sobel アルゴリズムを実装するプログラムを複数のスレッドで実行する必要がありました。スレッドが進む限り(私が知る限り)正しくプログラムを実行していますが、複数のスレッドを使用してプログラムを実装するたびに、バッファがないように見える分割領域に黒い境界線が表示されます宛先 BufferedImage への書き込み。
ファイルのスレッド化と書き込みを担当するメソッドのコードを次に示します。
public void processImage(int threads)
{
try{
File imgFile = new File(bmpFile);
image = ImageIO.read(imgFile);
w = image.getWidth();
wThr = (image.getWidth()/threads);
h = image.getHeight();
inData = new int[wThr*h];
BufferedImage[] pieces = new BufferedImage[threads];
//instantiate array used for storing pieces of image
for (int i=0; i<threads; i++){
pieces[i] = new BufferedImage(wThr, h, BufferedImage.TYPE_BYTE_GRAY);
}
wThr = pieces[0].getWidth();
h = pieces[0].getHeight();
//instantiate target image
combined = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
//split into threads, each one taking a division of the image and running algorithm
Thread[] threadList = new Thread[threads];
for (int i = 0; i < threadList.length; i++) {
image.getRaster().getPixels((i*wThr), 0, wThr, h, inData);
threadList[i] = new Pr1();
threadList[i].start();
try{
threadList[i].join();
}catch (InterruptedException ie) {}
//Write images to pieces and draw pieces individually onto target image
pieces[i].getRaster().setPixels(0, 0, wThr, h, outData);
Graphics2D g = combined.createGraphics();
g.drawImage(pieces[i], i*(wThr), 0, null);
g.dispose();
}
outFile = new File("1.bmp");
ImageIO.write(combined, "BMP", outFile);
}
catch(IOException e)
{
// Handle the exception here!
}
}
2スレッドで処理した時の画像です: http://i.imgur.com/n5gasAW.png?1
誰でもこれを修復する方法について何か洞察がありますか? 思いつく限りの方法で BufferedImages と配列のパラメーターを変更しましたが、まだうまくいきません。