Как определить поврежденные файлы TIFF в C #? - PullRequest
0 голосов
/ 02 июля 2018

У меня проблемы с загрузкой файлов Tiff в приложении C #. Когда файл TIFF загружается в приложение, он зависает. Это происходило потому, что этот файл TIFF поврежден.

Пожалуйста, порекомендуйте решение для выявления этих поврежденных файлов tiff, чтобы приложение не зависало или зависало при загрузке.

Ниже приведен фрагмент кода, в котором при открытии файла в объекте bmp приложение зависает в этой строке кода.

public void ReadTiff(byte[] fileData)
{
        try
        {
            using (var ms = new MemoryStream(fileData))
            {
                using (var bmp = new Bitmap(ms))
                {
                    // Some code
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
}

Я попробовал следующее с файлом:

  1. Попробовал открыть краску, не смог открыть.
  2. Также попытался открыть в средстве просмотра Windows, он не мог открыть.
  3. Попытка открытия в нескольких онлайн-средствах просмотра изображений, но она не может открыться.

1 Ответ

0 голосов
/ 02 июля 2018

Используйте приведенную ниже функцию для получения типа изображения, если оно возвращает ImageFormat.unknown для вашего изображения, оно повреждено и не является действительным изображением

public static ImageFormat GetImageFormat(byte[] bytes)
{
    var bmp    = Encoding.ASCII.GetBytes("BM");     // BMP
    var gif    = Encoding.ASCII.GetBytes("GIF");    // GIF
    var png    = new byte[] { 137, 80, 78, 71 };    // PNG
    var tiff   = new byte[] { 73, 73, 42 };         // TIFF
    var tiff2  = new byte[] { 77, 77, 42 };         // TIFF
    var jpeg   = new byte[] { 255, 216, 255, 224 }; // jpeg
    var jpeg2  = new byte[] { 255, 216, 255, 225 }; // jpeg canon

    if (bmp.SequenceEqual(bytes.Take(bmp.Length)))
        return ImageFormat.bmp;

    if (gif.SequenceEqual(bytes.Take(gif.Length)))
        return ImageFormat.gif;

    if (png.SequenceEqual(bytes.Take(png.Length)))
        return ImageFormat.png;

    if (tiff.SequenceEqual(bytes.Take(tiff.Length)))
        return ImageFormat.tiff;

    if (tiff2.SequenceEqual(bytes.Take(tiff2.Length)))
        return ImageFormat.tiff;

    if (jpeg.SequenceEqual(bytes.Take(jpeg.Length)))
        return ImageFormat.jpeg;

    if (jpeg2.SequenceEqual(bytes.Take(jpeg2.Length)))
        return ImageFormat.jpeg;

    return ImageFormat.unknown;
}

public enum ImageFormat
{
    bmp,
    jpeg,
    gif,
    tiff,
    png,
    unknown
}

Ссылка: - Проверить изображение из файла в C #

...