Java ImageIO.write正在保存带有失真的图像

Java ImageIO.write正在保存带有失真的图像,java,image,Java,Image,以下是我的绘画方法: 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")); 这是我填充rgbIn

以下是我的绘画方法:

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++;
}
rgbIntArray=newint[(rgbArray.length/3)];
int j=0;
对于(int i=0;i
我测试了这些值,它们似乎是正确的

我想问题出在
setRGB
的最后一个参数上,它要求“扫描线跨距”,老实说,我不知道它是什么。(但我在某处发现它可能是图像的宽度)。我假设其他参数是正确的

结果如下:

原始图像:


结果:


之后我将操纵图像。我只是打开并保存同一个图像。

我不知道如何初始化
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
高。

如何填充rgbIntArray?代码块中的
rgbArray
是什么?它是从图像读取的BGR数组。我猜
width
和/或
height
与原始图像不同,很可能是1像素。如何初始化这两个变量?我刚刚意识到width*height=82075和rgbIntArray.lenght=82320(rgbIntArray中还有245个(宽度)位置)