我有一个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条垂直黑线。
这是我的代码:
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");
}
}
答案 0 :(得分:0)
Raster
(即writeRaster
)的坐标系与SampleModel
的坐标系不同。根据{{1}}的文档:
虽然Raster可以在飞机的任何地方生活,但是
Raster
会生成 使用从SampleModel
开始的简单坐标系。光栅 因此包含允许像素位置的转换因子 被映射到(0, 0)
的坐标系和坐标系之间Raster
。从SampleModel
坐标系到。{ 可以通过SampleModel
获得Raster的那个getSampleModelTranslateX
方法。
此外,文档说明:
getSampleModelTranslateY
封装了存储样本值的Raster
和aDataBuffer
,描述如何在a中找到给定的样本值SampleModel
。
将这两个陈述放在一起,DataBuffer
中的样本是标准坐标平面中的样本的转置,因此在Raster
中包含getSampleModelTranslateX
和getSampleModelTranslateY
方法}类。因此,向Raster
方法提供坐标使用该转置坐标系。解决此问题的正确方法是反转代码中的 x 和 y 坐标。这可能看起来像是一个黑客,但这是一个正确的过程,因为两个坐标系被转置。那么你的代码就是:
setSample