Обнаружение, если файл изображения PNG является прозрачным изображением?
Я ищу способ быстро определить, имеет ли изображение PNG прозрачные функции. То есть, будет ли какая-либо часть изображения полупрозрачной или каким-либо образом отображает фон. Кто-нибудь знает простой способ обнаружить это?
UPDATE: ОК, есть ли более сложный способ вытащить спецификацию PNG и код взлома?
Ответы
Ответ 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, найденных в этой общей области, чтобы обмануть ваш код.