Блог → Подключение сканера по Easy TWAIN за несколько минут

Целью данной статьи я вижу рассказ о том, как просто и быстро подключить к своей программе TWAIN-совместимый сканер, используя интерфейс Easy TWAIN. При этом я не ставлю перед собой задачу подробного анализа этого интерфейса, исчерпывающую информацию на этот счёт можно найти на специальных сайтах, посвящённым стандартам TWAIN и Easy TWAIN. Если заинтересуетесь, то крайне рекомендую англоязычные ресурсы, там в разы больше полезной информации. А я же начну знакомство с Easy TWAIN. Поехали!

Интерфейс Easy TWAIN (EZTWAIN) под Win32 представляет собой динамическую библиотеку eztw32.dll. В своей работе EZTWAIN использует промышленный стандарт TWAIN, но существенно упрощает использование его в прикладных программах (собственно, отсюда и название "Easy TWAIN", что означает "простой TWAIN"). Для работы со сканером нужно просто динамически подключить эту библиотеку и вызывать из неё необходимые функции.

Где найти эту библиотеку? Версия 1.x распространяется свободно, и её возможностей вам вполне хватит. Начиная с версии 2.0 - библиотека становится коммерческим продуктом. Предположим, что вы выбрали версию 1.x и скачали файл eztwl.zip. Распаковав его, вы обнаружите листинги самой библиотеки (файлы VC\EZTWAIN.C и VC\EZT-WAIN.H), приложение иллюстрирующее пример её использования (VC\TWERP.С) и заголовочный файл TWAIN (VC\TWAIN.Н). Из всего этого для нас представляет интерес только сама библиотека (VC\RELEASE\EZTW32.DLL) и её заголовочный файл (VC\EZTWAIN.H). Найдите их и скопируйте в каталог своего проекта.

Easy TWAIN предоставляет разработчику солидный набор функций. Однако, для того, чтобы просто получить изображение со сканера нам понадобятся всего две:



Полное описание всех функций можно найти в файле EZTWAIN.Н. Обратите внимание, это важно: ни одна из функций EZTWAIN не будет работать, если на вашем компьютере нет самого интерфейса TWAIN (что, впрочем, крайне маловероятно). Признак его присутствия - наличие в каталоге WINDOWS или WINDOWS\SYSTEM библиотек TWAIN.DLL и TWAIN_32.DLL. Программно этот факт можно проверить, вызвав функцию EZTWAIN TWAIN_IsAvailable().

Переходим к созданию приложения - попробуем на практике получить изображение со сканера. Будем использовать среду разработки C++ Builder 5.0. Для начала - создадим новый проект. На его форму положим элемент TImage, в который и будет помещаться изображение со сканера. Ещё поместим на форму кнопку TButton, по нажатию которой будет происходить сканирование.

В заголовочный файл формы надо включить EZTWAIN.Н. Подключать библиотеку будем в конструкторе главной формы. Сделаем это так:

_fastcall TForml::TForml(TComponent* Owner):TForm(0wner)
{
// Подключаем EasyTwain
hLib=LoadLibrary("eztw32.dll");

(void *) SelectImageSource = GetProcAddress(hLib, "TWAIN_SelectImageSource");
(void *) AcquireToClipboard = GetProcAddress(hLib, "TWAIN_AcquireToClipboard"); bIsChoseScaner=FALSE;
}


Здесь: hLib - хэндл модуля, SelectlmageSource и AcquireToClipboard - указатели на функции библиотеки, blsChoseScaner - флаг, показывающий, выбран ли сканер. Все эти переменные описаны в заголовке класса формы. Сделаем так, чтобы сканер выбирался при показе формы. Для этого напишем обработчик события OnShow, в котором будем просто вызывать функцию TWAIN_SelectlmageSource:

void _fastcall TForml::FormShow(TObject *Sender)
{
bIsChoseScaner=FALSE;
// Окно выбора сканера
if(SelectlmageSource(Handle)) bIsChoseScaner=TRUE;
}


Последний шаг - создание обработчика кнопки сканирования:

void _fastcall TForml::ScanClick(TObject *Sender)
{
// Если выбран сканер
if(bIsChoseScaner)
// Если есть образ
if(AcquireToClipboard(Handle, TWAIN.ANYTYPE))
{
// Извлекаем из буфера обмена
TClipboard *pCB=Clipboard();
Imagel->Picture->Bitmap->LoadFrom ClipboardFormat(CF_BITMAP, pCB->GetAsHandle(CF_BITMAP),0);
}


Тут надо обратить внимание на небольшую тонкость. Второй параметр функции AcquireToClipboard задаёт тип получаемого изображения. Он не всегда может соответствовать физическим возможностям сканера. Гораздо проще присваивать этому параметру значение TWAIN_ANYTYPE (или просто 0), а нужный тип выбирать в появившемся после вызова функции диалоге сканирования. Вот собственно, и всё. Довольно просто, не правда ли? Осталось только запустить наше приложение, выбрать сканер, нажать кнопку сканирования - и получить готовое изображение!