Как проверить, является ли байтовый массив допустимым изображением? - PullRequest
18 голосов
/ 02 декабря 2011

Я знаю, что нет функции .Net, которая существует для проверки, но есть ли алгоритм или простой и эффективный способ проверки, является ли байт допустимым изображением, прежде чем я использую байтовый массив.Мне это нужно, потому что я посылаю разные команды серверу, который постоянно слушает клиента, и одна из команд - получить скриншот компьютера сервера.

Ответы [ 4 ]

33 голосов
/ 02 декабря 2011

Вы можете попытаться сгенерировать изображение из байтового массива и проверить на ArgumentException, если это не так.

public static bool IsValidImage(byte[] bytes)
{
    try {
        using(MemoryStream ms = new MemoryStream(bytes))
           Image.FromStream(ms);
    }
    catch (ArgumentException) {
       return false;
    }
    return true; 
}
9 голосов
/ 02 декабря 2011

Как уже отмечалось, попытка загрузить его в изображение является единственным отказоустойчивым способом.Вы можете проверить магический номер или заголовок файла в зависимости от [ожидаемого] типа изображения.Например, первые 8 октетов файла * .PNG в шестнадцатеричном виде:

0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A

http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

Большинство других типов файлов изображений имеют похожие магические номера.

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

3 голосов
/ 24 мая 2013

Для JPEG вы можете проверить, что первые два байта 0xFF, 0xD8 и последние два 0xFF, 0xD9. Конечно, все еще возможно, что данные изображения будут соответствовать тегу EOI, но это должно быть редко.

0 голосов
/ 23 июня 2017

По моему мнению, если вы хотите только ввод изображения (правильное изображение), то вы должны пойти с атрибутом accept поля ввода, например:

input type = "file" name = "uploadedFile" id ="imageContent" class = "required" accept = "image / *" />

Это даст вам только входные изображения.Таким образом, вы можете свободно кодировать бэкэнд.Не беспокоясь о том, является ли изображение действительным или нет.

И даже вы можете указать конкретный тип изображения, если хотите:

input type = "file" name = "uploadedFile" id = "imageContent"class =" required "accept =" image / jpeg, image / gif, image / png ">

...