Обнаружить пустой пиксель из файла - PullRequest
0 голосов
/ 19 ноября 2018

Для полной версии проекта проверьте репо здесь.Не стесняйтесь клонировать и бежать.Обратите внимание на тестовые изображения https://github.com/AshGale/Image2RGBA

При чтении в PNG с разделами, отображаемыми как пустые (хэшированные) в GIMP, значения, считываемые в программе, равны [0,0,0,255] (красный, зеленый, синий).Альфа).Я ожидаю, что пустой бит будет иметь альфа 0, поэтому полностью пустой [0,0,0,0].Однако значение [0,0,0,255] также является полным черным.

  1. Вопрос, как я могу проверить в java, является ли пиксель полностью пустым, т.е. хэширован в gimp.

  2. как я могу тогда написать этов файл изображения с bufferedImage.

  3. Должно ли значение альфа быть 0 для изображения с пустым, как показано на рисунке?Пожалуйста, предложите способ чтения в файле или в формате файла.

    // Извлечение кода Полный код см. в Git

...

for (int i = 0; i < imageHeight; i++) {
    for (int j = 0; j < imageWidth; j++) {

    individualPixel = new Color(buffImage.getRGB(j, i));

    //TODO find a way to detect a empty pixel an keep perfect black
    if(individualPixel.getRed() == 0 
            && individualPixel.getGreen() == 0
            && individualPixel.getBlue() ==0
            ) {                             

        //set pixel at location to empty
        buffRed.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
        buffGreen.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
        buffBlue.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
    }else {
        // RED
        tempPixel = new Color(individualPixel.getRed(), 0, 0, individualPixel.getAlpha());
        buffRed.setRGB(j, i, getIntFromColor(tempPixel.getRed(), 0, 0, tempPixel.getAlpha()));

        // GREEN

        // BLUE
    }

...

ImageIO.write(buffRed, "png", redImg);

enter image description here

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Я считаю, что проблема в вашем исходном коде заключается просто в следующей строке:

individualPixel = new Color(buffImage.getRGB(j, i));

Этот конструктор Color эффективно отбрасывает альфа-компонент.JavaDoc говорит (выделение мое):

Создает непрозрачный sRGB цвет с указанным комбинированным значением RGB [...] Альфа по умолчанию 255.

Вместо этого должно быть:

individualPixel = new Color(buffImage.getRGB(j, i), true); // hasAlpha = true

Этот конструктор JavaDoc говорит:

Создает цвет sRGB с указанным комбинированным значением RGBA [...] Если hasalpha аргумент false, альфа по умолчанию 255.

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

Наконец, значения R, G и B полностью прозрачного пикселя на самом деле не имеют значения.Поэтому проверка того, является ли все черным, может быть слишком строгой проверкой (хотя, кажется, она хорошо работает для вашего входного изображения).

PS: я думаю, что более точная терминология будет "прозрачной", а не "пустой».

0 голосов
/ 20 ноября 2018

Это рабочий пример, вы также можете увидеть его на моем github. Спасибо Томасу, который поддержал использование getAlphaRaster ()

// get RGB from image
BufferedImage buffImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);

try {
    buffImage = ImageIO.read(imageFile);
} catch (IOException e) {
}

int imageHeight = buffImage.getHeight();
int imageWidth = buffImage.getWidth();
Color individualPixel = null;
Color tempPixel = null;

BufferedImage buffRed = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);
BufferedImage buffGreen = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);
BufferedImage buffBlue = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);

WritableRaster imageRaster = buffImage.getAlphaRaster();
int[] pixel = new int[4];
int alpha = 0;

for (int i = 0; i < imageHeight; i++) {
    for (int j = 0; j < imageWidth; j++) {

        individualPixel = new Color(buffImage.getRGB(j, i));

        imageRaster.getPixel(j, i, pixel);
        alpha = pixel[0];//return 0 for empty

        //if(individualPixel.getAlpha() <255 || alpha >0)
            System.out.println(j + "," + i + " : " + individualPixel.getAlpha()+ "-"+alpha+ " =>" +
                    pixel[0] + " " + pixel[1] + " " + pixel[2] + " " + pixel[3]);

        //TODO find a way to detect a empty pixel an keep perfect black
        if(individualPixel.getRed() == 0 
                && individualPixel.getGreen() == 0
                && individualPixel.getBlue() ==0
                & alpha == 0) {                             

            //set pixel at location to empty
            buffRed.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
            buffGreen.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
            buffBlue.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
        }else {
            // RED
            tempPixel = new Color(individualPixel.getRed(), 0, 0, individualPixel.getAlpha());
            buffRed.setRGB(j, i, getIntFromColor(tempPixel.getRed(), 0, 0, tempPixel.getAlpha()));

            // GREEN
            tempPixel = new Color(0, individualPixel.getGreen(), 0, individualPixel.getAlpha());
            buffGreen.setRGB(j, i, getIntFromColor(0, tempPixel.getGreen(), 0, tempPixel.getAlpha()));

            // BLUE
            tempPixel = new Color(0, 0, individualPixel.getBlue(), individualPixel.getAlpha());
            buffBlue.setRGB(j, i, getIntFromColor(0, 0, tempPixel.getBlue(), tempPixel.getAlpha()));
        }
    }   
    System.out.println("");                 
}

// Save Images to path of selected file
try {
    ImageIO.write(buffRed, "png", redImg);
    ImageIO.write(buffGreen, "png", greenImg);
    ImageIO.write(buffBlue, "png", blueImg);
} catch (IOException e) {

    JOptionPane.showMessageDialog(null, "Failed to create RGB files");
    e.printStackTrace();
}
...