Два похожих метода с BufferedImage, один работает, другой нет.Зачем? - PullRequest
0 голосов
/ 13 февраля 2012

Я попытался сделать метод, который изменяет один цвет BufferedImage, чтобы быть невидимым.
Я не могу найти решение сам, поэтому я прошу вашей помощи.
Вот метод, сделанный мной:

public static BufferedImage makeWithoutColor(BufferedImage img, Color col)
{
    BufferedImage img1 = img;
    BufferedImage img2 = new BufferedImage(img1.getWidth(), img1.getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = img2.createGraphics();
    g.setComposite(AlphaComposite.Src);
    g.drawImage(img1, null, 0, 0);
    g.dispose();
    for(int i = 0; i < img2.getWidth(); i++)
    {
        for(int j = 0; i < img2.getHeight(); i++)
        {
            if(img2.getRGB(i, j) == col.getRGB())
            {
                img2.setRGB(i, j, 0x8F1C1C);
            }
        }
    }
    return img2;
}

А вот один из учебника, который я прочитал.

public static BufferedImage makeColorTransparent(BufferedImage ref, Color color) {
    BufferedImage image = ref;
    BufferedImage dimg = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = dimg.createGraphics();
    g.setComposite(AlphaComposite.Src);
    g.drawImage(image, null, 0, 0);
    g.dispose();
    for(int i = 0; i < dimg.getHeight(); i++) {
        for(int j = 0; j < dimg.getWidth(); j++) {
            if(dimg.getRGB(j, i) == color.getRGB()) {
            dimg.setRGB(j, i, 0x8F1C1C);
            }
        }
    }
    return dimg;
}

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Ваша ошибка в этой строке:

for(int j = 0; i < img2.getHeight(); i++)

должно быть:

for(int j = 0; j < img2.getHeight(); j++)
//             ^                     ^ as Ted mentioned...
0 голосов
/ 13 февраля 2012

Я предполагаю, что под "невидимым" вы подразумеваете, что хотите сделать один цвет прозрачным. Вы не сможете сделать это, используя этот подход, потому что setRGB не влияет на альфа-канал. Вам лучше использовать фильтр изображений. Вот подход, взятый из этой темы :

public static Image makeWithoutColor(BufferedImage img, Color col)
{
    ImageFilter filter = new RGBImageFilter() {

        // the color we are looking for... Alpha bits are set to opaque
        public int markerRGB = col.getRGB() | 0xFF000000;

        public final int filterRGB(int x, int y, int rgb) {
            if ((rgb | 0xFF000000) == markerRGB) {
                // Mark the alpha bits as zero - transparent
                return 0x00FFFFFF & rgb;
            } else {
                // nothing to do
                return rgb;
            }
        }
    };
    ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
    return Toolkit.getDefaultToolkit().createImage(ip);
}

Это превратит любой пиксель с указанным цветом RGB и любой прозрачностью в полностью прозрачный пиксель того же цвета.

...