Прозрачные области BufferedImage пишут черным

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

        for(Pixel p : closed){
            Color c = new Color(image.getRGB(p.x, p.y));
            Color newC = new Color(0,0,0, 0);
            image.setRGB(p.x, p.y, newC.getRGB() & 0x00000000);
        }

        if(andCrop){
            image = image.getSubimage(left, top, right-left, bottom-top);
        }


        return image;

Затем я пытаюсь записать изображение:

try {

            BufferedImage out = new BufferedImage(image.getWidth(), image.getHeight(), java.awt.Transparency.TRANSLUCENT);
            Graphics2D g2d = out.createGraphics();
            g2d.setComposite(AlphaComposite.Clear);
            g2d.fillRect(0, 0, image.getWidth(), image.getHeight());
            g2d.setComposite(AlphaComposite.Src);
            g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
            g2d.dispose();

            File outputfile = new File(file);
            ImageIO.write(out, "png", outputfile);
        } catch (IOException e) {

        }

Теперь я знаю, что "вне" ясно, прежде чем я попытаюсь нарисовать изображение на нем. Что я не понимаю, так это то, что не так с моим композитингом. Вместо того, чтобы выглядеть прозрачным, я получаю полный черный цвет.

Все используемые буферизованные изображения являются INT_ARGB.

РЕДАКТИРОВАТЬ - Это было решено. Источник изображения был из ImageIO.read, и возвращенный BufferedImage не поддерживает альфа. Быстрое преобразование после чтения позволяет гладко выполнять остальную часть кода.

2 ответа

Решение

Вот так, теперь это было отклонено, поэтому я не уверен, что это будет актуально, но проблема заключалась в том, что оригинальный BufferedImage считывался ImageIO, и это изображение не поддерживало ARGB. Быстрое преобразование после чтения позволило остальной части кода работать.

Вещи, которые приходят мне в голову... (спасибо Андрею):

java.awt.Transparency.TRANSLUCENT = 3
TYPE_INT_ARGB = 2
TYPE_INT_ARGB_PRE = 3

public BufferedImage(int width,
                 int height,
                 int imageType)

Constructs a BufferedImage of one of the predefined image types. (TYPE_...)

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/image/BufferedImage.html

так что, похоже, это путаница.

Кроме того, какого эффекта вы хотите достичь? Вы очищаете пустое изображение, а затем рисуете на нем полностью прозрачные пиксели... Я просто не понимаю.

Другие вопросы по тегам