2015-10-01 5 views
0

У меня есть функция в Java, которая использует ImageIO.read() для чтения файла и обнаружить, если его полностью прозрачным:ImageIO не анализирует правильные .png правильно?

private static boolean isFullyAlpha(File f) throws IOException { 
    BufferedImage img = ImageIO.read(f); 
    for (int y = 0; y < img.getHeight(); y++) { 
     for (int x = 0; x < img.getWidth(); x++) { 
      if (((img.getRGB(x, y) >> 24) & 0xFF) != 0) { 
       println(f.name + " " + ((img.getRGB(x, y) >> 24) & 0xFF) + " " + x + " " + y) 
       return false; 
      } 
     } 
    } 
    return true; 
} 

Если я стараюсь читать очень простой файл, который был создан с помощью функции Convert ImageMagick путем кадрирования изображения его возвращает, что первый пиксель этого изображения имеет 255 альфа (вообще не прозрачен), тогда как он работает для других изображений.

Файл, который является неправильным с ImageIO: https://dl.dropboxusercontent.com/u/9186429/imageTest/mountainMap41.png

ли в Java ImageIO глючит? Если да, то какая библиотека могла бы правильно разобрать это изображение? Редакторы изображений, такие как Paint.NET или Gimp, правильно интерпретируют это изображение.

Примечание: Файл правильно проанализирован с помощью этой функции:
https://dl.dropboxusercontent.com/u/9186429/imageTest/mountainMap305.png

ответ

1

Разница между PNG файлов, что mountainMap305.png индексируется (тип цветовой палитры), используя PLTE кусок, и добавляет прозрачность в палитре с помощью tRNS кусок, содержащий индексы палитры.

mountainMap41.png С другой стороны, это оттенки серого (оттенок серого) и добавляет прозрачность для всех пикселей, используя кусок tRNS, содержащий значения оттенков серого. Последнее не поддерживается в текущем PNGImageReader от Oracle (ни tRNS с RGB-значениями). Поддерживается только полный альфа-канал для оттенков серого или RGB.

Возможно, вы исправите это самостоятельно, изменив изображение на подходящий тип изображения с помощью альфы, затем посмотрите на метаданные изображения и замените все пиксели, соответствующие этому цвету. Но я не уверен, что это будет правильно, если значения на изображении уже исправлены гамма/цвет ...

Смежные вопросы