将像素转换为BufferedImage

时间:2018-04-08 02:31:03

标签: java image pixel

我有一个2D整数数组,表示像素灰度强度值:

0 255 0 255 0 255 0 255 0 255 
0 255 0 255 0 255 0 255 0 255 
0 255 0 255 0 255 0 255 0 255 
0 255 0 255 0 255 0 255 0 255 
0 255 0 255 0 255 0 255 0 255 
0 255 0 255 0 255 0 255 0 255 
0 255 0 255 0 255 0 255 0 255 
0 255 0 255 0 255 0 255 0 255 
0 255 0 255 0 255 0 255 0 255 
0 255 0 255 0 255 0 255 0 255 

显然,有5条垂直线条在转换为图像后会变成黑色。 但是,我的最终图像有5条水平线。我不明白为什么我得到黑色水平线,而不是垂直线。将像素[i] [j]更改为像素[j] [i]会产生垂直线,但这不是我想要的。我想知道为什么我的图片有5条水平黑线,而我的像素值有5条垂直黑线。

enter image description here

这是我的代码:

public static void main(String[] args) throws IOException {
        BufferedImage image = null;
        SampleModel sm = null;
        WritableRaster writeRaster = null;
        Raster raster = null;
        int[][] pixel = new int[10][10];

        // containing only white pixels in an image
        for (int i = 0; i < 10; i++) 
            for(int j = 0; j < 10; j++) 
                pixel[i][j] = 255;
        printPixels(pixel);

        // make black vertical lines by changing intensity value
        for (int i = 0; i < 10; i++) 
            for(int j = 0; j < 10; j+=2) 
                pixel[i][j] = 0;
        printPixels(pixel);

        image = new BufferedImage(10, 10, BufferedImage.TYPE_BYTE_GRAY);
        raster = image.getData();
        sm = raster.getSampleModel();
        writeRaster = Raster.createWritableRaster(sm, new Point(0, 0));
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                 writeRaster.setSample(i, j, 0, pixel[i][j]);
            }
        }
        image.setData(writeRaster);
        writeFile(image, "modified.gif");
    }
}

1 个答案:

答案 0 :(得分:0)

Raster(即writeRaster)的坐标系与SampleModel的坐标系不同。根据{{​​1}}的文档:

  

虽然Raster可以在飞机的任何地方生活,但是Raster会生成   使用从SampleModel开始的简单坐标系。光栅   因此包含允许像素位置的转换因子   被映射到(0, 0)的坐标系和坐标系之间   Raster。从SampleModel坐标系到。{   可以通过SampleModel获得Raster的那个   getSampleModelTranslateX方法。

此外,文档说明:

  

getSampleModelTranslateY封装了存储样本值的Raster和a   DataBuffer,描述如何在a中找到给定的样本值   SampleModel

将这两个陈述放在一起,DataBuffer中的样本是标准坐标平面中的样本的转置,因此在Raster中包含getSampleModelTranslateXgetSampleModelTranslateY方法}类。因此,向Raster方法提供坐标使用该转置坐标系。解决此问题的正确方法是反转代码中的 x y 坐标。这可能看起来像是一个黑客,但这是一个正确的过程,因为两个坐标系被转置。那么你的代码就是:

setSample