4

这是我的绘画方法:

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,它要求“扫描线步幅”,老实说,我不知道它是什么。(但我发现某处可能是图像的宽度)。我假设其他参数是正确的。

结果如下:

原图:

原图http://i.minus.com/jy7iVQxtghO0l.bmp


结果:

结果 http://i.minus.com/jz86D3YkuPPhG.bmp

之后我会处理图像。我只是打开并保存相同的图像。

4

1 回答 1

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同一数组中更高的索引开始。

于 2013-05-04T02:07:18.073 回答