gpt4 book ai didi

java - 将图像转换为二维数组,然后用 Java 取回图像

转载 作者:行者123 更新时间:2023-11-30 06:25:58 44 4
gpt4 key购买 nike

我想将图像转换为二维像素数组,对其进行一些操作,然后将生成的二维数组转换回图像。但结果我总是得到一个纯黑色的图像。我无法弄清楚我哪里出错了。这是我正在做的。所有操作都需要在 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.. 每个像素都有小失真。但它会破坏整个图像。有什么解决方法吗?

最佳答案

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

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

关于java - 将图像转换为二维数组,然后用 Java 取回图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15002706/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com