2013-08-15 1 views
1

Когда я отлаживаю приложения WPF с исключительным шансом, я получил много NotSupportedException с сообщением «формат пикселей не поддерживается». Если я игнорирую исключение, изображения будут работать отлично, но я все равно хочу их исправить, поэтому я получаю возможность взглянуть на другие исключения из первого шанса.Программно обнаруживать и преобразовывать изображения с пиксельным форматом не поддерживаются

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

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

+0

Вы имеете в виду, помимо написания инструмента, который загружает изображения, ловит исключение, а затем преобразует изображение? В каком формате вы конвертируете вручную и с каким графическим редактором вы работаете? – EricLaw

+0

@ EricLaw Я борюсь со знанием образа вместо других частей. Я прочитал некоторые ссылки, но не мог понять, какой именно формат WPF счастлив/недоволен, я знаю только, открываю ли я файл в Photoshop и сохраняю, не изменяя никаких свойств изображения, проблема исчезает. –

+0

Можете ли вы разместить образец изображения, который выдает это исключение? –

ответ

3

Существуют различные форматы файлов - PNG - один, где несколько разных форматов изображений хранятся в одном файле. В этом случае это глубина изображения (бит на пиксель). Так что .NET, вероятно, пытается сначала открыть файл с наиболее распространенным форматом, и когда это не удается, он пытается использовать разные форматы, пока не получит тот, который работает.

Поскольку это редкое событие, разумно просто попытаться открыть файл, а затем поймать результирующее исключение и повторить попытку.

Вы ничего не можете поделать с этим, так как исключение возникает и (что более важно) обрабатывается в коде создания образа.

Вы столкнулись с одной из больших опасностей превращения «исключения с первой вероятностью». Вы получите ряд этих «ложных» ошибок. Этот режим должен использоваться только для реальных проблем, с которыми вы сталкиваетесь, когда не знаете, где возникает исключение. По мере того как изображение читается успешно, у вас действительно нет ошибки.


Если .NET действительно не может прочитать формат файла, то вам нужно нужно улавливать исключение и сделать «что-то разумное» в обработчике:

foreach (string file in files) 
{ 
    try 
    { 
     // Your code to process the image 
     var image = Image.Fromfile(file); 
    } 
    catch (NotSupportedException ex) 
    { 
     var process = new Process(); 
     process.Exited += ExitedHandler; 
     // Call other app to convert file 
     string arguments = file + command line arguments necessary 
     process.Start(conversion program, arguments); 
    } 

ExitedHandler можно назвать код, что процессы изображение, поэтому нет необходимости снова перебирать преобразованные файлы.

+0

Спасибо за быстрый ответ. Возможно, мой вопрос был недостаточно ясен, у меня возникают трудности с частью обработки изображений, то есть, что должно быть внутри предложения try, чтобы имитировать один и тот же стек, когда изображение загружено в XAML, и что должно быть внутри «catch», для преобразования изображения в формат, который принимает WPF? –

+0

@ NS.X. Я предположил, что у вас проблемы с частью улова. То, что я написал, в значительной степени то, что вам нужно. 'conversion program '- это имя вашего редактора изображений, который вы используете вручную. Аргументами являются имя файла и параметры, необходимые для преобразования. Что касается части загрузки изображения, я думаю, что просто создание «Image» будет делать. – ChrisF

+0

Я не хотел запускать скрипт инструмента преобразования - для этого я использую Photoshop для этой цели, который слишком тяжелый для цикла. Есть ли способ сделать это исключительно в .NET-коде? –