Как преобразовать изображение в прозрачное изображение в Java - PullRequest
2 голосов
/ 23 июня 2010

Как конвертировать белый фон изображения в прозрачный фон? Может кто-нибудь сказать мне, как это сделать?

Ответы [ 3 ]

4 голосов
/ 23 июня 2010

Первый результат от Google такой:

Сделать цвет прозрачным http://www.rgagnon.com/javadetails/java-0265.html

Это делает синюю часть изображения прозрачной, но я уверен, что вы можете адаптировать ее для использования белого вместо

(подсказка: передать Color.WHITE в функцию makeColorTransparent вместо Color.BLUE)

Здесь вы найдете более полный и современный ответ: Как сделать цвет прозрачным в BufferedImage и сохранить как PNG

1 голос
/ 05 июня 2014

Этот метод сделает фон прозрачным. Вам нужно передать изображение, которое вы хотите изменить, цвет и допуск.

final int color = ret.getRGB(0, 0);
final Image imageWithTransparency = makeColorTransparent(ret, new Color(color), 10);
final BufferedImage transparentImage = imageToBufferedImage(imageWithTransparency);

private static BufferedImage imageToBufferedImage(final Image image) {
        final BufferedImage bufferedImage =
            new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
        final Graphics2D g2 = bufferedImage.createGraphics();
        g2.drawImage(image, 0, 0, null);
        g2.dispose();
        return bufferedImage;
}


private static Image makeColorTransparent(final BufferedImage im, final Color color, int tolerance) {
    int temp = 0;

    if (tolerance < 0 || tolerance > 100) {

        System.err.println("The tolerance is a percentage, so the value has to be between 0 and 100.");

        temp = 0;

    } else {

        temp = tolerance * (0xFF000000 | 0xFF000000) / 100;

    }

    final int toleranceRGB = Math.abs(temp);



    final ImageFilter filter = new RGBImageFilter() {

        // The color we are looking for (white)... Alpha bits are set to opaque

        public int markerRGBFrom = (color.getRGB() | 0xFF000000) - toleranceRGB;

        public int markerRGBTo = (color.getRGB() | 0xFF000000) + toleranceRGB;



        public final int filterRGB(final int x, final int y, final int rgb) {

            if ((rgb | 0xFF000000) >= markerRGBFrom && (rgb | 0xFF000000) <= markerRGBTo) {

                // Mark the alpha bits as zero - transparent

                return 0x00FFFFFF & rgb;

            } else {

                // Nothing to do

                return rgb;

            }

        }

    }; 

    final ImageProducer ip = new FilteredImageSource(im.getSource(), filter);

    return Toolkit.getDefaultToolkit().createImage(ip);
}
0 голосов
/ 14 августа 2010

Вот мое решение.Этот фильтр удалит фон из любого изображения, если цвет фона изображения находится в верхнем левом углу.

private static class BackgroundFilter extends RGBImageFilter{

    boolean setUp = false;
    int bgColor;

    @Override
    public int filterRGB(int x, int y, int rgb) {
        int colorWOAlpha = rgb & 0xFFFFFF;
        if( ! setUp && x == 0 && y == 0 ){
            bgColor = colorWOAlpha;
            setUp = true;
        }
        else if( colorWOAlpha == bgColor )
            return colorWOAlpha;
        return rgb;
    }
}

В другом месте ...

ImageFilter bgFilter = new BackgroundFilter();
ImageProducer ip = new FilteredImageSource(image.getSource(), bgFilter);
image = Toolkit.getDefaultToolkit().createImage(ip);
...