BufferedImage.getRGB(x, y) не дает альфа

У меня есть BufferedImage i, и я хотел бы получить Color из определенного пикселя этого image , включая альфа-значение. Пиксель идентифицируется с помощью координат x и y.

Вот что я пробовал:

Color c = new Color(i.getRGB(x, y));

По какой-то причине новый объект цвета содержит правильный RGB, но альфа теряется.

Что я делаю неправильно?

Заранее спасибо

Ответ 1

Однопараметрический конструктор Color, который вы используете, отбрасывает альфа-информацию. Вместо этого используйте двухпараметрическую версию и перейдите в true для hasalpha:

Color c = new Color(i.getRGB(x, y), true);

Соответствующий Javadoc:

Color(int rgb)

Создает непрозрачный цвет sRGB с указанным комбинированным значением RGB, состоящим из красного компонента в битах 16-23, зеленого компонента в битах 8-15 и синего компонента в битах 0-7.

Color(int rgba, boolean hasalpha)

Создает цвет sRGB с указанным комбинированным значением RGBA, состоящим из альфа-компонента в битах 24-31, красным компонентом в битах 16-23, зеленым компонентом в битах 8-15 и синим компонентом в битах 0- 7.

Ответ 2

Альфа не потеряна.

Вы должны использовать либо конструктор (int, boolean), который принимает информацию о пикселях, и указывает, имеет ли он альфа-значения с булевым или конструктором, который принимает 4 значения: красный, зеленый, синий и альфа.

информация о конструкторе (int, int, int, int) из JavaDoc

Чтобы сократить код, вы всегда можете заменить весь следующий код на Color color = new Color(i.getRGB(x, y), true);  который сообщает конструктору цвета, что информация о пикселях содержит значение Alpha.

(int, boolean) информация конструктора из JavaDoc

Обратите внимание, что иногда при извлечении альфа следующий путь может возвращать -1, и в этом случае это означает, что он возвращается обратно к 255, поэтому вы должны выполнить 256-1, чтобы получить фактическое значение альфа. этот фрагмент демонстрирует, как загрузить изображение и получить цвет этого изображения в определенных координатах, в данном случае 0,0. Следующий пример может показать вам, как получить каждое значение цвета, включая альфа, и восстановить его на новый цвет.

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;

public class main {

    public static void main(String [] args){
        BufferedImage image = null;
        try {
            image = ImageIO.read(new URL("image.png"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        int pixel = image.getRGB(0, 0);

        int alpha = (pixel >> 24) & 0xff;
        int red = (pixel >> 16) & 0xff;
        int green = (pixel >> 8) & 0xff;
        int blue = (pixel >> 0) & 0xff;

        Color color1 = new Color(red, green, blue, alpha);

        //Or use
        Color color2 = new Color(image .getRGB(0, 0), true);

    }
   }

BufferedImages getRGB (int, int) JavaDoc, как вы можете видеть, как он говорит:

Returns an integer pixel in the default RGB color model (TYPE_INT_ARGB) and default sRGB colorspace. Color conversion takes place if this default model does not match the image ColorModel. There are only 8-bits of precision for each color component in the returned data when using this method.

что означает, что также получает значение Alpha.