pgm ファイルを読み取り、それに含まれる値の配列を 2D 配列に格納する必要があります。PGM 形式では、各ピクセルは 0 から MaxVal までのグレー値で指定されます。最初の 3 行は、画像に関連する情報 (マジック ナンバー、高さ、幅、および maxVal) を提供します。ファイルには空白も含まれます。# で始まる行はコメントです。今まで書いてきたものです。
public class PGM{
public static void main(String args[]) throws Exception {
FileInputStream f = new FileInputStream("C:\\......\\brain_001.pgm");
DataInputStream d = new DataInputStream(f);
d.readLine();//first line contains P5
String line = d.readLine();//second line contains height and width
Scanner s = new Scanner(line);
int width = s.nextInt();
int height = s.nextInt();
line = d.readLine();//third line contains maxVal
s = new Scanner(line);
int maxVal = s.nextInt();
byte[][] im = new byte[height][width];
for (int i = 0; i < 258; i++) {
for (int j = 0; j < 258; j++) {
im[i][j] = -1;
}
}
int count = 0;
byte b;
try {
while (true) {
b = (byte) (d.readUnsignedByte());
if (b == '\n') { //do nothing if new line encountered
} else if (b == '#') {
d.readLine();
} else if (Character.isWhitespace(b)) { // do nothing if whitespace encountered
} else {
im[count / width][count % width] = b;
count++;
}
}
} catch (EOFException e) {
}
System.out.println("Height=" + height);
System.out.println("Width=" + height);
System.out.println("Required elemnts=" + (height * width));
System.out.println("Obtained elemnets=" + count);
}
}
プログラムを実行すると、次の出力が得られます。
Height=258
Width=258
Required elemnts=66564
Obtained elemnets=43513
要素の数 (それぞれがグレー値に対応) が必要な数よりも少ない。PGM ビューアでファイルを開くと、すべてが正しく表示されます。また、配列の内容を印刷すると、多くの負の値が表示されます。ただし、それらはすべてゼロ以上でなければなりません。どこで間違ったのですか?