Поиск на сайте
Главная Журнал Форум Wiki DRKB Страны мира

Сканирование картинок при помощи TWAIN-драйвера в .NET

В Windows-приложениях, предназначенных для обработки графики, чаще всего используются TWAIN API-функции. К сожалению, .NET Framework не имеет встроенной поддержки для TWAIN, поэтому с TWAIN приходится работать через методы фреймворка для доступа к этим API. В приведённом примере не содержится готовой библиотеки, а только некоторые существенные шаги по минимальной адаптации к TWAIN приложений написанных в .NET.

Детали

Первым шагом было портирование самых важных частей TWAIN.H, они находятся в TwainDefs.cs . Основная логика для вызова TWAIN расположена в классе Twain, в файле TwainLib.cs . Так как TWAIN API предоставляются в виде Windows DLL (twain_32.dll), то необходимо использовать механизм DllImport для взаимодействия со старым кодом. Эта DLL имеет центральную DSM_Entry() с порядковым номером функции №1, экспортируемым в качестве отправной точки для TWAIN. Эта функция имеет множество параметров, последний из которых является переменной типа!

[DllImport("twain_32.dll", EntryPoint="#1")]
private static extern TwRC DSMparent(
    [In, Out] TwIdentity origin,
    IntPtr zeroptr,
    TwDG dg, TwDAT dat, TwMSG msg,
    ref IntPtr refptr );

Класс Twain имеет простой 5-ступенчатый интерфейс:

class Twain
{
    Init();
    Select();
    Acquire();
    PassMessage();
    TransferPictures();
}

Для различных колбэков, TWAIN использует специальные Windows-сообщения, которые должны быть пойманы из цикла сообщений приложения. В .NET нашёлся единственный подходящий для этого способ IMessageFilter.PreFilterMessage(), который активируется вызовом Application.AddMessageFilter(). В фильтре мы должны направлять каждое сообщение в Twain.PassMessage().

Пример приложения

Приложение выполнено в виде MDI Windows Forms. Оно имеет два пункта меню, связанные с TWAIN: Select Source... и Acquire... Как только изображение сосканировано, мы можем сохранить его в файл в любом из GDI+ поддерживаемых форматов (BMP, GIF, TIFF, JPEG. ..)

Ограничения

Весь код был протестирован только на Windows 2000SP2, с usb-сканером Epson Perfection и цифровой фотокамерой Olympus. Сканированное изображение (по TWAIN спецификации) является Windows DIB, а пример кода содержит очень мало перехватчиков исключительных ситуаций. К сожалению, в .NET нет прямого метода для преобразования DIB в управляемый класс Bitmap ... С цветовой палитрой и меню могут возникать некоторые общеизвестные проблемы.

Обратите внимание, корни TWAIN берут своё начало в 16-разрядных версиях Windows! Если необходимо использовать более современные API поддерживаемые в Windows ME/XP, посмотрите в сторону Windows Image Acquisition (WIA).

Скачать исходник - 16 кб

Скачать демонстрашку - 12 кб




Основные разделы сайта


 

Реклама