【问题标题】:How to draw image using RGB?如何使用 RGB 绘制图像?
【发布时间】:2014-05-26 09:03:39
【问题描述】:

我这里有半工作代码。我画得不好,图像没有正确绘制。我正在读取数组 RGB 值(ppm 格式)。我不确定我做错了什么,但这是我的代码和图片(它应该是红色的蓝旗亚 Stratos):

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);


}

} 非常感谢任何帮助...谢谢

【问题讨论】:

  • 我的猜测是您将行(高度)的变化和列(宽度)的变化混为一谈。这种情况经常发生。尝试将设置的 RGB 更改为:img.setRGB(p, k, col);。如果这是正确的,我可以将其作为答案发布。
  • 我会打印出扫描仪读取的所有内容,以帮助调试您的问题。你看起来不合时宜。您是否小心跳过 PPM 注释行?
  • @Obicere 不,刚刚尝试过,但它不起作用。
  • @HovercraftFullOfEels 没有注释行。文件内容为PPM,后跟宽、高、最大rgb颜色,其余为RGB中像素的三元组
  • @stryk3r1215 我刚刚制作了自己的 ppm 测试文件,修改了程序,使第一个循环条件为 k &lt; heightp &lt; widthimg.setRGB(p, k, col);,这对我来说非常有效。

标签: java ppm


【解决方案1】:

数据存储在二维数组中的方式存在问题。在二维数组中,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 &lt; height 时,您表示这将通过更改行来完成。

当您将循环条件设置为p &lt; width 时,对于第二个循环(嵌套在第一个循环中),您声明这将通过更改列来完成。

因此,在使用笛卡尔平面时,点的(i,j)位置实际上是(p,k)的形式。这通常会混淆。

所以最后,将设置的 RGB 更改为:img.setRGB(p, k, col);

【讨论】:

  • 如果我可以投票,我会的。感谢您的帮助和澄清!
猜你喜欢
  • 2023-04-02
  • 2012-04-22
  • 1970-01-01
  • 2014-04-08
  • 2013-03-09
  • 1970-01-01
  • 2013-06-19
  • 2021-06-03
  • 2021-05-11
相关资源
最近更新 更多