Сохранение TIFF в формате PNG

у меня такой код

using (Image image = System.Drawing.Image.FromStream(sourceStream))
{
    Guid objGuid = image.FrameDimensionsList[0];
    FrameDimension objDimension = new FrameDimension(objGuid);
    int pageCount = image.GetFrameCount(objDimension);

    for (int i = 0; i < pageCount; i++)
    {
          image.SelectActiveFrame(objDimension, i);
          resultStream = new MemoryStream();
          image.Save(resultStream, ToSystemImageFormat(outputFormat));
          result.Add(resultStream.ToArray());
    }
}

цель - сохранить каждую страницу TIFF как png и сохранить ее как массив байтов. Проблема в том, что на моих двух компьютерах с WIN7, которые я тестировал, он работает нормально. Но у меня есть один компьютер с WinXP, и этот фрагмент кода завершается ошибкой с исключением «Параметр недействителен». Документ TIFF всегда один и тот же. Кто-нибудь знает, где проблема?

Я пытался использовать ImageConverter:

ImageConverter imageConverter = new System.Drawing.ImageConverter();
using (Image image = (Image)imageConverter.ConvertFrom(sourceContent))
{
     Guid objGuid = image.FrameDimensionsList[0];
     FrameDimension objDimension = new FrameDimension(objGuid);
     int pageCount = image.GetFrameCount(objDimension);

     for (int i = 0; i < pageCount; i++)
     {
            image.SelectActiveFrame(objDimension, i);
            resultStream = new MemoryStream();
            image.Save(resultStream, ToSystemImageFormat(outputFormat));
            result.Add(resultStream.ToArray());
      }
}

но это тоже не с тем же исключением. Спасибо

UPD#1: Не работает метод Image.FromStream(). Забыл упомянуть, что большинство TIFF-документов конвертируются без проблем, на некоторых не получается. А вот на WIN7 и с этими специфическими всё нормально.


person nKognito    schedule 26.01.2012    source источник
comment
Какая строка кода вызывает исключение?   -  person cadrell0    schedule 26.01.2012
comment
Пожалуйста, опубликуйте полное сообщение об исключении и трассировку стека.   -  person jrummell    schedule 26.01.2012
comment
Не могу опубликовать полную трассировку стека, потому что WinXP не является компьютером разработчика   -  person nKognito    schedule 26.01.2012
comment
Можете ли вы изменить приложение для регистрации полного сообщения об исключении и StackTrace? Кроме того, что в этот момент находится в sourceStream?   -  person cadrell0    schedule 26.01.2012


Ответы (2)


Я знаю, что winxp имеет ограниченную поддержку png. Вы не можете загружать файлы значков, которые на самом деле являются сжатыми png (стандарт для win 7) в .net 4.0, работающем на winxp, вы получаете то же исключение.

person antiduh    schedule 26.01.2012
comment
Проблема в том, что он не работает с конкретным документом TIFF, большинство из них конвертируются без проблем. - person nKognito; 26.01.2012
comment
О, я вижу, ваша формулировка сбила меня с толку. Вы всегда получаете исключение параметра при попытке запустить свой код в этом конкретном TIFF? Не могли бы вы опубликовать трассировку стека? Похоже, что этот конкретный TIFF либо поврежден, либо структурирован таким образом, что библиотеки изображений не понимают, либо используют некоторые функции TIFF, которые не реализованы в библиотеках изображений. Насколько я понимаю, TIFF довольно сложный стандарт. - person antiduh; 26.01.2012
comment
Основная проблема в том, что TIFF, который не работает на WinXP - работает на Win7 - person nKognito; 26.01.2012
comment
Я это понимаю, и мой ответ по-прежнему соответствует такому поведению. .Net Ultimate использует возможности ОС для обработки изображений. Win 7, вероятно, имеет более полную реализацию TIFF. Этот конкретный образ использует некоторые функции TIFF, которые не поддерживаются реализацией в Win XP, но поддерживаются в Win 7. - person antiduh; 26.01.2012
comment
Это я тоже понимаю. Проблема в том, как это исправить - person nKognito; 26.01.2012
comment
Я знаю, что это много работы, но чтобы понять это, я бы рекомендовал разобрать TIFF с помощью инструментов отладки, чтобы узнать, какова его структура и каково использование функций. Затем сделайте это с другими изображениями и сравните. Я предполагаю, что этот TIFF использует какую-то функцию, которой нет в других. В качестве альтернативы, поищите библиотеку TIFF, которую вы можете использовать с .Net, которая имеет более полную поддержку, и используйте ее вместо этого. - person antiduh; 26.01.2012

Я рекомендую попробовать LibTiff.Net. В качестве альтернативы вы можете использовать libtiff (код C++), но я подозреваю, что LibTiff.Net будет проще вызывать из вашего кода .Net.

person Joel Rondeau    schedule 26.01.2012