2

ここに半作業コードがあります。描画がうまくいかず、画像が正しく描画されません。RGB 値 (ppm 形式) を配列に読み込んでいます。何が間違っているのかわかりませんが、これが私のコードと写真です(赤いランチアストラトスであるはずです):

http://oi60.tinypic.com/20h91kk.jpg

package ppmHomework;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class ReadImage {

public ReadImage() {

}

public static void main(String[] args) throws FileNotFoundException {

    int width, height, maxRGB;

    File file = new File("ppmImage.ppm");

    Scanner kb = new Scanner(file);
    kb.next();
    width = kb.nextInt();
    height = kb.nextInt();
    maxRGB = kb.nextInt();
    JFrame frame;
    BufferedImage img;

    int[] arrayImage = new int[width * height * 3];

    int j=0;
    while (kb.hasNextInt()) {
        arrayImage[j] = kb.nextInt();
        j++;
    }

    img = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
    int i = 0;
    for (int k = 0; k < width; k++) {
        for (int p = 0; p < height; p++) {
            System.out.println(arrayImage[i] + " " + arrayImage[i+1] + " " + arrayImage[i+2] + " " + i); 
                int col = new Color(arrayImage[i], arrayImage[i+1], arrayImage[i+2]).getRGB();
                img.setRGB(k, p, col);
                i+=3;
            }

        }
    frame = new JFrame("WINDOW");
    frame.setVisible(true);

    frame.add(new JLabel(new ImageIcon(img)));

    frame.pack();
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);


}

どんな助けでも大歓迎です...ありがとう

4

1 に答える 1

2

問題は、データが 2D 配列に格納される方法に存在します。2D 配列でiは、 は行の変更であり、jは列の変更です。次に、次のことがわかります。

      i
  +---------------> Change in columns
  | 4   7   8  10
  | 5   1  23   4
j | 8   2   1   0
  | 4   6   8   1
  |
  V Change in rows

ループ条件をk < height最初のループに設定すると、これは行の変更によって行われることを示しています。

ループ条件を に設定するp < widthと、2 番目のループ (最初のループでネスト) に対して、これが列の変更によって行われることを示しています。

したがって、点の (i, j) 位置は、デカルト平面を使用する場合、実際には (p, k) の形式になります。これは通常、混同されます。

最後に、set RGB を次のように変更しますimg.setRGB(p, k, col);

于 2014-04-12T04:00:14.420 に答える