【问题标题】:ImageIO.write is saving image with distortionImageIO.write 正在保存失真的图像
【发布时间】:2013-04-28 11:36:46
【问题描述】:

这是我的绘画方法:

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

结果如下:

原图:

Original image http://i.minus.com/jy7iVQxtghO0l.bmp


结果:

Result http://i.minus.com/jz86D3YkuPPhG.bmp

我将在之后处理图像。我只是打开并保存同一张图片。

【问题讨论】:

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

标签: java image


【解决方案1】:

我不知道你如何初始化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 的索引开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多