【问题标题】:Getting and setting RGB values on a BufferedImage在 BufferedImage 上获取和设置 RGB 值
【发布时间】:2014-03-01 18:11:45
【问题描述】:

我在处理 Java 中的 RGB 值时遇到了非常糟糕的情况,这让我开始尝试用这个做一些小实验。

我得出了这个结论:加载图像,获取它的 rgb 值并创建具有相同值的新图像。不幸的是,这不起作用(图像显示不同,请参见图片),按照以下代码...有人能看出什么问题吗?

BufferedImage oriImage=ImageIO.read(new  URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));

int[] oriImageAsIntArray = new int[oriImage.getWidth()*oriImage.getHeight()];
oriImage.getRGB(0, 0, oriImage.getWidth(),oriImage.getHeight(), oriImageAsIntArray, 0, 1);

BufferedImage bfImage= new BufferedImage(oriImage.getWidth(),oriImage.getHeight(),
            BufferedImage.TYPE_INT_ARGB);

bfImage.setRGB(0,0,bfImage.getWidth(),bfImage.getHeight(),oriImageAsIntArray, 0, 1);

【问题讨论】:

    标签: java bufferedimage argb


    【解决方案1】:

    显然,getRGBsetRGB 没有正确使用。

    我把代码改成:

    oriImage.getRGB(0, 0, oriImage.getWidth(),oriImage.getHeight(), oriImageAsIntArray, 0,  oriImage.getWidth());
    (...)
    bfImage.setRGB(0,0,bfImage.getWidth(),bfImage.getHeight(),oriImageAsIntArray, 0, bfImage.getWidth());
    

    ...图片正确显示。我仍然不明白最后一个论点是什么。在JavaDoc中是这样描述的:

    scansize - scanline stride for the rgbArray
    

    【讨论】:

    • 看起来最后一个参数是图像的宽度,因此该方法知道何时开始每个新行。
    • 嗯,不确定:宽度已经作为第三个参数发送...并且图像宽度已经在构造函数中设置...
    • 是扫描线的长度。 :-) 在大多数情况下,这等于宽度,但也可以更大。对于某些显示/图像格式,在每条扫描线的末尾放置填充可能是有意义的(例如,确保每条新线从偶数开始,即下一个字/长字边界)。这些填充像素不会使图像更宽,但仍然是支持数据缓冲区/数组的一部分,这就是您需要此参数的原因。只要您使用一个值 >= 图像宽度,并且在两个地方使用相同的值,您应该是好的。说得通? :-)
    猜你喜欢
    • 1970-01-01
    • 2014-12-09
    • 2014-02-22
    • 1970-01-01
    • 2013-09-12
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多