Java: извлечь альфа-канал из BufferedImage - PullRequest
4 голосов
/ 30 мая 2011

Я хотел бы извлечь альфа-канал из буферизованного изображения и нарисовать его на отдельном изображении в оттенках серого. (вроде это отображается в фотошопе)

Ответы [ 3 ]

5 голосов
/ 30 мая 2011

Не проверено, но содержит основные пункты.

public Image alpha2gray(BufferedImage src) {

    if (src.getType() != BufferedImage.TYPE_INT_ARGB)
        throw new RuntimeException("Wrong image type.");

    int w = src.getWidth();
    int h = src.getHeight();

    int[] srcBuffer = src.getData().getPixels(0, 0, w, h, (int[]) null);
    int[] dstBuffer = new int[w * h];

    for (int i=0; i<w*h; i++) {
        int a = (srcBuffer[i] >> 24) & 0xff;
        dstBuffer[i] = a | a << 8 | a << 16;
    }

    return Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(w, h, pix, 0, w));
}
4 голосов
/ 30 мая 2011

Я не верю, что для этого существует единственный вызов метода; вам нужно будет получить все данные изображения и замаскировать альфа-байт для каждого пикселя. Так, например, используйте getRGB(), чтобы получить пиксели ARGB для изображения. Наиболее значимым байтом является значение альфа. Таким образом, для каждого пикселя в массиве вы получаете от getRGB(),

int alpha = (pixel >> 24) & 0xFF; 
3 голосов
/ 30 мая 2011

Вы можете получить растр из BufferedImage, а затем создать дочерний растр этого, который содержит только интересующую вас полосу (параметр bandList),Из этого дочернего растра вы можете создать новый BufferedImage с подходящей ColorModel, которая будет содержать только маску aplpha в градациях серого.

Преимущество в том, что вы делаете это таким образом, вместо ручной итерации поПиксели в том, что среда выполнения имеет шанс получить представление о том, что вы делаете, и, таким образом, это может ускориться за счет использования аппаратных возможностей.Честно говоря, я сомневаюсь, что это ускорится с нынешними JVM, но кто знает, что принесет будущее?

...