这是我的绘画方法:
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
bi.setRGB(0, 0, width, height, rgbIntArray, 0, width);
ImageIO.write(bi, "bmp", new File("C:/Users/Felipe/Desktop/img2.bmp"));
这就是我填充rgbIntArray的方式:
rgbIntArray = new int[(rgbArray.length / 3)];
int j = 0;
for (int i = 0; i < rgbArray.length; i += 3)
{
rgbIntArray[j] = unsignedToBytes(rgbArray[i]) +
unsignedToBytes(rgbArray[i + 1]) * 256 +
unsignedToBytes(rgbArray[i + 2]) * 65536;
j++;
}
我测试了这些值,它们似乎是正确的。
我认为问题出在setRGB
的最后一个参数上,它要求“扫描线步幅”,说实话我不知道它是什么。 (但我发现某处可能是图像的宽度)。我假设其他参数都是正确的。
结果如下:
原始图片:
结果:
之后我将操纵图像。我只是打开并保存相同的图像。
答案 0 :(得分:0)
我不知道你如何初始化rgbArray
,但每一行都以黑色像素(图像外)结束。如果通过直接从图像文件中读取字节来初始化rgbArray
,它可能代表一个新行。或者您未正确初始化rgbArray
。
黑色像素在剪切图像上显示为对角线。
您可以通过更改以下内容跳过每行末尾的黑色像素:
bi.setRGB(0, 0, width, height, rgbIntArray, 0, width);
到此:
bi.setRGB(0, 0, width, height, rgbIntArray, 0, width + 1);
最后一个参数width + 1
基本上表示如果给定的行从数组中的某个索引开始,那么下一行将从同一数组中width + 1
的索引处开始