Использование сканера в Delphi

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

Однако использование сканера как оказалось не совсем тривиальная задача. В одной проекте на Delphi мне понадобилось использовать сканер и получать изображения с него. При первом рассмотрении нашлось несколько решений:

Каждый из способов хорош по своему.

Использование ActiveX достаточно просто. В окне установи ActiveX компонента следует выбрать Kodak Scan Image Control и перекомпилировать пакет с компонентов.

 Kodak Scan image control

В проекте использование будет выглядеть следующим образом. Сначала проверим доступность сканера (ScannerAvailable), затем открываем его (OpenScanner), указываем куда сканировать (ScanTo = 2 — в файл), наконец запускаем сканирование методом StartScan:

if ImgScan1.ScannerAvailable then
  try
    ImgScan1.OpenScanner; 
    ImgScan1.ScanTo := 2;    
    ImgScan1.Image:='c:\MyPicture.gif'; 
    ImgScan1.StartScan ; 
    Application.ProcessMessages; 
  finally  
    ImgScan1.CloseScanner ; 
  end;

Из недостатков нужно отметить наличие компонента imgscan.ocx на целевых компьютерах, что традиционно для ActiveX.

Компонент DelphiTwain вполне удобен в работе имеет настройки. Домашняя страница проекта — http://delphitwain.sourceforge.net. После установки его традиционным образом и установки его на форму проекта сканирование запускается так:

procedure TForm1.Button1Click(Sender: TObject);
var
  SourceIndex: Integer; 
begin
  //Пытамся загрузить библиотеку
  if DelphiTwain1.LoadLibrary then
  begin
    //Аналогично SourceManangerLoaded := TRUE
    DelphiTwain1.LoadSourceManager();
    //Выбираем источник
    SourceIndex := DelphiTwain1.SelectSource();
    if SourceIndex <> -1 then
      with DelphiTwain1.Source[SourceIndex] do
      begin
        //Подготавливаем для передачи данных используя режим ttmFile
        Loaded := TRUE;
        TransferMode := ttmFile;
        Enabled := TRUE;
      end 
    else 
       ShowMessage('Cancelled')
  end 
  else ShowMessage('Twain не установлен')
end;

Однако, третий способ через библиотеку EZTwain Classic показался наиболее удобным и простым. Библиотека eztwain написана на C++, для нее существует заголовочный pas-файл на Delphi для подключения к проектам. Сам проект EZTwain является коммерческим и Pro версию необходимо покупать. Однако версия EZTwain Classic является бесплатной, потому что не предполагает поддержку и имеет ограниченный функционал по сравнению с Pro-версией. Чтобы подключить библиотеку к проекту нужно подключить этот файл и положить файл eztw32.dll в директорию проекта.

Диалог выбора сканера открывается следующим образом:

procedure TForm1.btSelectScanerClick(Sender: TObject);
begin
    TWAIN_SelectImageSource(Handle);
end;

Непосредственно сканирование в файл запускаем так:

procedure TForm1.btScanClick(Sender: TObject);
begin
 {Получаем указатель на графические данные}
 TWAIN_RegisterApp(1, 1, 1049, 7, 'Название окна', 'Название организации', '', 'Имя приложения');
 TWAIN_SetHideUI(Integer(True)); //скрываем интерфейс сканера
 TWAIN_AcquireToFilename(Handle, PChar(ExtractFilePath(ParamStr(0))+'tmpscan.bmp'));
end;

Способ понравился тем, что нет необходимость устанавливать или регистрировать дополнительных библиотек. К проекту линкуется дополнительная библиотека, которая напрямую используется TWAIN.

Speak up! Let us know what you think.