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

Тема в разделе "C++ / C# / .NET", создана пользователем Евгенька, 3 апр 2015.

  1. Гость, давай поддержим форум вместе, делись информацией с друзями через кнопки в блоке "Поделиться в социальных сетях"

    Скрыть объявление
  1. Евгенька

    Евгенька Banned

    
    Регистр:
    20 фев 2015
    Сообщения:
    153
    Лайки:
    192
    Дизлайки:
    0
    Баллы:
    30
    Пол:
    Мужской
    [​IMG]

    В 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 кб (кликабельно)
     
Похожие Темы
  1. DimixeR
    Ответов:
    3
    Просмотров:
    366
  2. KaKAuH[xD]
    Ответов:
    4
    Просмотров:
    246
  3. assasin_007
    Ответов:
    6
    Просмотров:
    107
Загрузка...