2

画像をピクセルの2D配列に変換し、いくつかの操作を行ってから、結果の2D配列を画像に変換し直したいと思います。しかし、結果として私は常に真っ黒な画像を取得しています。どこが悪いのかわからない。これが私がしていることです.8ビットのグレースケール画像ですべての操作を行う必要があります。

  • まず、ピクセルの2D配列を取得します。

    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

画像が真っ黒になっているSampleModelRasterは、間違っているからだと思います。これが私があなたのコードでしたことです:

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 に答える