2

我想将图像转换为像素的二维数组,对其进行一些操作,然后将生成的二维数组转换回图像。但结果我总是得到一个纯黑色的图像。我无法弄清楚我哪里出错了。这是我正在做的。所有操作都需要在 8 位灰度图像上完成。

  • 首先,我得到了二维像素数组。

    public int[][] compute(File file)
    {
    try 
    {
        BufferedImage img= ImageIO.read(file);
        Raster raster=img.getData();
        int w=raster.getWidth(),h=raster.getHeight();
        int pixels[][]=new int[w][h];
        for (int x=0;x<w;x++)
        {
            for(int y=0;y<h;y++)
            {
                pixels[x][y]=raster.getSample(x,y,0);
            }
        }
    
        return pixels;
    
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    return null;
    }
    
  • 然后我对像素数组进行一些操作

  • 接下来,我将数组转换回图像。

    public java.awt.Image getImage(int pixels[][])
    {
         int w=pixels.length;
         int h=pixels[0].length;
         BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_BYTE_GRAY);
         WritableRaster raster=(WritableRaster)image.getData();
         for(int i=0;i<w;i++)
         {
             for(int j=0;j<h;j++)
             {
                 raster.setSample(i,j,0,pixels[i][j]);
             }
         }
    
    File output=new File("check.jpg");
    try {
        ImageIO.write(image,"jpg",output);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    return image;
    }
    

但是我得到了一个全黑的图像,我确信它不是全黑的。我应该怎么做才能得到正确的结果?

编辑- 应用 efan 的解决方案后,当我将图像保存到文件时,假设 (0,0) 的像素值为 68,然后在计算同一文件的像素值时,它有时会更改为 70,有时会更改为 71.. 有每个像素的小失真。但它会破坏整个图像。有什么解决办法吗?

4

1 回答 1

5

我认为图像完全是黑色的原因是SampleModelforRaster是错误的。这是我对您的代码所做的:

private SampleModel sampleModel;

public int[][] compute(File file)
{
    ...
    sampleModel = raster.getSampleModel();
    ...
}

public java.awt.Image getImage(int pixels[][])
{
    ...
    WritableRaster raster= Raster.createWritableRaster(sampleModel, new Point(0,0));
    for(int i=0;i<w;i++)
    {
        for(int j=0;j<h;j++)
        {
            raster.setSample(i,j,0,pixels[i][j]);
        }
    }

    BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_BYTE_GRAY);
    image.setData(raster);
    ...
}

这对我来说很好。我的理解是,这BufferedImage.TYPE_BYTE_GRAY并不能完全选择你需要的东西。不同的东西可能会更好,但我不知道这些类型与颜色/样本模型究竟是如何对应的。如果你知道你需要哪个样本模型,你可以使用它:

WritableRaster raster= Raster.createWritableRaster(new PixelInterleavedSampleModel(0, w, h, 1, 1920, new int[] {0}), new Point(0,0));
于 2013-02-21T14:59:07.260 回答