【问题标题】:Changing Pixels of a BufferedImage Changes Pixels for Other BufferedImages更改 BufferedImage 的像素会更改其他 BufferedImage 的像素
【发布时间】:2014-05-03 04:48:49
【问题描述】:

我对 Java 还很陌生,对在 Java 中编辑图像完全陌生。我所拥有的是正在加载到我的程序中的图像,其中包含具有三种灰度的 32x32 叶子图像。我拥有的是叶子 BufferedImage,它保存着灰色的叶子精灵。我还有一个 greenLeaf、redLeaf、orangeLeaf 和 pinkLeaf BufferedImage。当我运行下面的代码时,由于某种原因,最后一种颜色会覆盖所有其他颜色,并且它们都变成橙色。谁能告诉我为什么,以及解决方法?

public void colorLeaves()
{
            leaf=ss.grab32Image(4, 1);
    greenLeaf=leaf;
    redLeaf=leaf;
    pinkLeaf=leaf;
    orangeLeaf=leaf;
    for(int xx=0;xx<leaf.getWidth();xx++)
    {
        for(int yy=0;yy<leaf.getHeight();yy++)
        {
            int clr = leaf.getRGB(xx, yy);
            int red = (clr & 0x00ff0000) >> 16;
            int green = (clr & 0x0000ff00) >> 8;
            int blue = clr & 0x000000ff;
            Color c1=new Color(0,0,0);
            Color c2=new Color(0,0,0);
            Color c3=new Color(0,0,0);

            /*
             * GREEN
             */
            c1 = new Color(0,158,15); //Middle Shade
            c2 = new Color(0,119,11); //Dark Shade
            c3 = new Color(0,198,16); //Light Shade
            if(red==128&&green==128&&blue==128)
            {
                greenLeaf.setRGB(xx, yy, c1.getRGB());
            }
            if(red==96&&green==96&&blue==96)
            {
                greenLeaf.setRGB(xx, yy, c2.getRGB());
            }
            if(red==165&&green==165&&blue==165)
            {
                greenLeaf.setRGB(xx, yy, c3.getRGB());
            }

            /*
             * RED
             */

            c1 = new Color(219,26,42); //Middle Shade
            c2 = new Color(183,22,35); //Dark Shade
            c3 = new Color(247,56,72); //Light Shade
            if(red==128&&green==128&&blue==128)
            {
                redLeaf.setRGB(xx, yy, c1.getRGB());
            }
            if(red==96&&green==96&&blue==96)
            {
                redLeaf.setRGB(xx, yy, c2.getRGB());
            }
            if(red==165&&green==165&&blue==165)
            {
                redLeaf.setRGB(xx, yy, c3.getRGB());
            }

            /*
             * PINK
             */

            c1 = new Color(255,56,152); //Middle Shade
            c2 = new Color(216,49,130); //Dark Shade
            c3 = new Color(255,102,175); //Light Shade

            if(red==128&&green==128&&blue==128)
            {
                pinkLeaf.setRGB(xx, yy, c1.getRGB());
            }
            if(red==96&&green==96&&blue==96)
            {
                pinkLeaf.setRGB(xx, yy, c2.getRGB());
            }
            if(red==165&&green==165&&blue==165)
            {
                pinkLeaf.setRGB(xx, yy, c3.getRGB());
            }

            /*
             * ORANGE
             */

            c1 = new Color(255,110,38); //Middle Shade
            c2 = new Color(224,97,33); //Dark Shade
            c3 = new Color(249,136,79); //Light Shade

            if(red==128&&green==128&&blue==128)
            {
                orangeLeaf.setRGB(xx, yy, c1.getRGB());
            }
            if(red==96&&green==96&&blue==96)
            {
                orangeLeaf.setRGB(xx, yy, c2.getRGB());
            }
            if(red==165&&green==165&&blue==165)
            {
                orangeLeaf.setRGB(xx, yy, c3.getRGB());
            }
        }
    }
}

【问题讨论】:

    标签: java image replace pixel bufferedimage


    【解决方案1】:

    redLeafgreenLeafpinkLeaforangeLeaf 所有对同一对象的引用。因此,对一个所做的任何修改都会改变所有其他的。这就是为什么只发生最后一次更改的原因。

    您可以查看有关如何克隆缓冲图像的帖子:How do you clone a BufferedImage

    【讨论】:

    • 感谢您的快速响应,它运行良好。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多