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.