【问题标题】:Reading a gray scale image into 1-d array将灰度图像读入一维数组
【发布时间】:2013-02-20 08:03:19
【问题描述】:

我编写了以下代码来将灰度图像的像素读取到一维数组。 运行代码时我怎么会出错

 public class LoadImage {
   BufferedImage image;
   void load()throws Exception { 
     File input = new File("lena.png");
     image = ImageIO.read(input);
   }
   public Dimension getImageSize() {
     return new Dimension(image.getWidth(), image.getHeight());
   }

   public int[] getImagePixels() {
     int [] dummy = null;
     int wid, hgt;

     // compute size of the array
     wid = image.getWidth();
     hgt = image.getHeight();

     // start getting the pixels
     Raster pixelData;
     pixelData = image.getData();
     return pixelData.getPixels(0, 0, wid, hgt, dummy);
   }
 }

主类

 public static void main(String[] args) throws IOException, Exception {
   LoadImage l = new LoadImage();
   l.load();
   int pixel[];
   pixel= l.getImagePixels();
 }

【问题讨论】:

  • 确切的错误信息是什么?
  • 请发布完整的堆栈跟踪...
  • FileNotFoundException?这就是我在计算机上运行此代码时得到的结果:)
  • @JasonSperske 那是因为您的计算机中没有“lena.png”文件。
  • 'int 像素[];'看起来不正确

标签: java image image-processing bufferedimage grayscale


【解决方案1】:

好的,当您传递 File 对象时,问题来自 ImageIO.read 中的格式检测。试试这个:

import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.IOException;
import javax.imageio.ImageIO;

public class LoadImage {
  BufferedImage image;
  void load() throws Exception { 
    image = ImageIO.read(getClass().getResourceAsStream("lena.png"));
  }

  public Dimension getImageSize() {
    return new Dimension(image.getWidth(), image.getHeight());
  }

  public int[] getImagePixels() {
    int [] dummy = null;
    int wid, hgt;

    // compute size of the array
    wid = image.getWidth();
    hgt = image.getHeight();

    // start getting the pixels
    Raster pixelData;
    pixelData = image.getData();

    System.out.println("wid:"+ wid);
    System.out.println("hgt:"+ hgt);
    System.out.println("Channels:"+pixelData.getNumDataElements());
    return pixelData.getPixels(0, 0, wid, hgt, dummy);
  }

  public static void main(String[] args) throws IOException, Exception {
    LoadImage l = new LoadImage();
    l.load();
    int[] pixel;
    pixel= l.getImagePixels();
    System.out.println("length:"+pixel.length);

    int height = 482;
    int width = 372;
    int channels = 3;
    int color = 0;

    BufferedImage red = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
    BufferedImage green = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
    BufferedImage blue = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);

    for (int y = 0; y < height; y++) {
      for (int x = 0; x < width; x++) {
        blue.setRGB(x, y, pixel[color * channels]);
        green.setRGB(x, y, pixel[color * channels + 1] << 8);
        red.setRGB(x, y, pixel[color * channels + 2] << 16);
        color++;
      }
    }
    ImageIO.write(red, "png", new File("red.png"));
    ImageIO.write(green, "png", new File("green.png"));
    ImageIO.write(blue, "png", new File("blue.png"));
  }
}

当我传递一个 372x482(24 位(3 通道)颜色)的 PNG 时,我得到了

wid:372
hgt:482
Channels:3
length:537912

使用更新后的代码,这就是您可以获取它返回的数组并将每个通道保存回文件的方法。

【讨论】:

  • 您的代码运行良好。现在我需要将数组写回图像文件。我写了以下代码,但我得到的只是一张黑色图像public void write(int width ,int height, int[] pixel) { try { // retrieve image BufferedImage writeImage = new BufferedImage(512, 512, BufferedImage.TYPE_BYTE_GRAY);; File outputfile = new File("saved.png"); WritableRaster raster = (WritableRaster) writeImage.getData(); raster.setPixels(0,0,width,height,pixel); ImageIO.write(writeImage, "png", outputfile); }
  • @user1998915,我刚刚更新了我的答案,向您展示如何将 pixelData 保存回文件。就我而言,我使用的是 3 通道图像,因此如果您的图像只有一个通道,则必须稍微修改它。另外,由于图像大小在getImagePixels() 的返回值中丢失了,我手动将这些值反馈给 for 循环。
  • -您的代码将生成 3 张图像?(红色、蓝色和绿色)。处理灰度图像时应该使用什么命令而不是 setRGB?
  • 别介意最后的评论我仔细研究了你在评论中所做的事情。您可能想将其分解为自己的问题以获得更多帮助
  • 谢谢。我已经发布了这个问题。也许你可以帮我。
猜你喜欢
  • 1970-01-01
  • 2020-12-24
  • 2014-11-21
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2020-02-21
  • 2015-04-22
  • 1970-01-01
相关资源
最近更新 更多