Подтвердить что ты не робот

Обнаружение, если файл изображения PNG является прозрачным изображением?

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

UPDATE: ОК, есть ли более сложный способ вытащить спецификацию PNG и код взлома?

4b9b3361

Ответ 1

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

    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;
    }

Ответ 2

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

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

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

Ответ 3

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