Обнаружение, является ли файл изображения PNG прозрачным изображением? - PullRequest
17 голосов
/ 03 апреля 2010

Я ищу способ быстро определить, имеет ли изображение в формате PNG прозрачные элементы. То есть, является ли какая-либо часть изображения полупрозрачной или каким-либо образом отображает фон. Кто-нибудь знает простой способ обнаружить это?

ОБНОВЛЕНИЕ: ОК, есть ли менее сложный способ, чем вытащить спецификацию PNG и код взлома?

Ответы [ 3 ]

18 голосов
/ 03 апреля 2010

Почему бы просто не просмотреть все пиксели изображения и проверить их альфа-значения?

    bool ContainsTransparent(Bitmap image)
    {
        for (int y = 0; y < image.Height; ++y)
        {
            for (int x = 0; x < image.Width; ++x)
            {
                if (image.GetPixel(x, y).A != 255)
                {
                    return true;
                }
            }
        }
        return false;
    }
4 голосов
/ 03 апреля 2010

Ну, я до сих пор не совсем понял вопрос, но если вы просто хотите проверить, может ли данное изображение использовать функции прозрачности, вы можете использовать этот код:

Image img = Image.FromFile ( "...", true );
if ( (img.Flags & 0x2) != 0)
{
}

Хотя это не поможет вам определить, действительно ли данный png-файл использует прозрачные функции, он укажет, что он имеет цветовой тип 4 или 6 (оба поддерживают прозрачность) в соответствии со спецификацией файла png.

1 голос
/ 21 февраля 2013

Вот эффективный подход: Откройте PNG в двоичном формате. Искать до байта 26 (25, если считать с нуля). Оцените значение байта символа: 2 или ниже => определенно непрозрачный, 3 или выше => поддерживает прозрачность. Согласно моим выводам, файлы, сгенерированные Photoshop, используют только 3 или выше, когда это необходимо, что делает это надежным способом определения их использования. Похоже, что почти во всех файлах есть 2 для непрозрачных и 6 для альфа-смешанных. Вы также можете проверить строки PNG и IHDR, найденные в этой общей области, для защиты вашего кода от ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...