Получение изображений от TWAIN сканера непосредственно на диск
В этом разделе
Большинство TWAIN устройства поддерживают режим передачи File и позволяют сохранять отсканированные изображения непосредственно в файл.
Режимы передачи, поддерживаемые устройством, можно получить с помощью метода Vintasoft.Twain.Device.GetSupportedTransferModes.
TWAIN устройства всегда могут сохранять отсканированные изображения в виде файлов BMP. Профессиональные устройства могут сохранять отсканированные изображения в виде файлов TIFF, JPEG, PDF, ...
Форматы файлов, поддерживаемые устройством, можно получить с помощью метода Vintasoft.Twain.Device.GetSupportedImageFileFormats.
Форматы сжатия данных изображения, поддерживаемые устройством, можно получить с помощью метода Vintasoft.Twain.Device.GetSupportedImageCompressions.
Вот C#/VB.NET код, который демонстрирует, как сохранять отсканированные изображения непосредственно на диск в виде файлов JPEG с качеством изображения в 70%:
static bool _isScanningFinished;
/// <summary>
/// Index of acquired image.
/// </summary>
static int _imageIndex;
/// <summary>
/// Uses File tranfer for saving TWAIN acquired images directly to a file on disk.
/// </summary>
public static void UseFileTransferForAcquiringImagesFromTwainDevice()
{
_isScanningFinished = false;
// create the device manager
using (Vintasoft.Twain.DeviceManager deviceManager = new Vintasoft.Twain.DeviceManager())
{
deviceManager.IsTwain2Compatible = true;
// open the device manager
deviceManager.Open();
// get the device
Vintasoft.Twain.Device device = deviceManager.DefaultDevice;
if (device == null)
return;
// subscribe to device events
SubscribeToDeviceEvents(device);
// disable device UI
device.ShowUI = false;
// set the File transfer mode
device.TransferMode = Vintasoft.Twain.TransferMode.File;
// open the device
device.Open();
// specify that grayscale images must be acquired
device.PixelType = Vintasoft.Twain.PixelType.Gray;
// set the inches as unit of measure
device.UnitOfMeasure = Vintasoft.Twain.UnitOfMeasure.Inches;
device.Resolution = new Vintasoft.Twain.Resolution(300f, 300f);
// run asynchronous image acqusition
device.Acquire();
// wait while feeder will be stopped
while (!_isScanningFinished)
{
System.Windows.Forms.Application.DoEvents();
}
// unsubscribe from device events
UnsubscribeFromDeviceEvents(device);
// close the device
device.Close();
}
}
/// <summary>
/// Image is acquiring.
/// </summary>
private static void Device_ImageAcquiring(object sender, Vintasoft.Twain.ImageAcquiringEventArgs e)
{
string fileExtension = "bmp";
switch (e.FileFormat)
{
case Vintasoft.Twain.TwainImageFileFormat.Tiff:
fileExtension = "tif";
break;
case Vintasoft.Twain.TwainImageFileFormat.Jpeg:
fileExtension = "jpg";
break;
}
e.Filename = System.IO.Path.Combine(@"d:\images\", string.Format("page{0}.{1}", _imageIndex, fileExtension));
}
/// <summary>
/// Image is acquired.
/// </summary>
private static void device_ImageAcquired(object sender, Vintasoft.Twain.ImageAcquiredEventArgs e)
{
System.Console.WriteLine(string.Format("Image is saved to a file '{0}'.", System.IO.Path.GetFileName(e.Filename)));
_imageIndex++;
}
/// <summary>
/// Scan is completed.
/// </summary>
private static void device_ScanCompleted(object sender, System.EventArgs e)
{
System.Console.WriteLine("Scan is completed.");
}
/// <summary>
/// Scan is canceled.
/// </summary>
private static void device_ScanCanceled(object sender, System.EventArgs e)
{
System.Console.WriteLine("Scan is canceled.");
}
/// <summary>
/// Scan is failed.
/// </summary>
private static void device_ScanFailed(object sender, Vintasoft.Twain.ScanFailedEventArgs e)
{
System.Console.WriteLine(string.Format("Scan is failed: {0}.", e.ErrorString));
}
/// <summary>
/// Scan is finished.
/// </summary>
private static void device_ScanFinished(object sender, System.EventArgs e)
{
Vintasoft.Twain.Device device = (Vintasoft.Twain.Device)sender;
// unsubscribe from device events
UnsubscribeFromDeviceEvents(device);
// if device is not closed
if (device.State != Vintasoft.Twain.DeviceState.Closed)
// close the device
device.Close();
System.Console.WriteLine("Scan is finished.");
_isScanningFinished = true;
}
/// <summary>
/// Subscribes to the device events.
/// </summary>
private static void SubscribeToDeviceEvents(Vintasoft.Twain.Device device)
{
device.ImageAcquiring += new System.EventHandler<Vintasoft.Twain.ImageAcquiringEventArgs>(Device_ImageAcquiring);
device.ImageAcquired += new System.EventHandler<Vintasoft.Twain.ImageAcquiredEventArgs>(device_ImageAcquired);
device.ScanCompleted += new System.EventHandler(device_ScanCompleted);
device.ScanCanceled += new System.EventHandler(device_ScanCanceled);
device.ScanFailed += new System.EventHandler<Vintasoft.Twain.ScanFailedEventArgs>(device_ScanFailed);
device.ScanFinished += new System.EventHandler(device_ScanFinished);
}
/// <summary>
/// Unsubscribes from the device events.
/// </summary>
private static void UnsubscribeFromDeviceEvents(Vintasoft.Twain.Device device)
{
device.ImageAcquiring -= new System.EventHandler<Vintasoft.Twain.ImageAcquiringEventArgs>(Device_ImageAcquiring);
device.ImageAcquired -= new System.EventHandler<Vintasoft.Twain.ImageAcquiredEventArgs>(device_ImageAcquired);
device.ScanCompleted -= new System.EventHandler(device_ScanCompleted);
device.ScanCanceled -= new System.EventHandler(device_ScanCanceled);
device.ScanFailed -= new System.EventHandler<Vintasoft.Twain.ScanFailedEventArgs>(device_ScanFailed);
device.ScanFinished -= new System.EventHandler(device_ScanFinished);
}
Shared _isScanningFinished As Boolean
''' <summary>
''' Index of acquired image.
''' </summary>
Shared _imageIndex As Integer
''' <summary>
''' Uses File tranfer for saving TWAIN acquired images directly to a file on disk.
''' </summary>
Public Shared Sub UseFileTransferForAcquiringImagesFromTwainDevice()
_isScanningFinished = False
' create the device manager
Using deviceManager As New Vintasoft.Twain.DeviceManager()
deviceManager.IsTwain2Compatible = True
' open the device manager
deviceManager.Open()
' get the device
Dim device As Vintasoft.Twain.Device = deviceManager.DefaultDevice
If device Is Nothing Then
Return
End If
' subscribe to device events
SubscribeToDeviceEvents(device)
' disable device UI
device.ShowUI = False
' set the File transfer mode
device.TransferMode = Vintasoft.Twain.TransferMode.File
' open the device
device.Open()
' specify that grayscale images must be acquired
device.PixelType = Vintasoft.Twain.PixelType.Gray
' set the inches as unit of measure
device.UnitOfMeasure = Vintasoft.Twain.UnitOfMeasure.Inches
device.Resolution = New Vintasoft.Twain.Resolution(300F, 300F)
' run asynchronous image acqusition
device.Acquire()
' wait while feeder will be stopped
While Not _isScanningFinished
System.Windows.Forms.Application.DoEvents()
End While
' unsubscribe from device events
UnsubscribeFromDeviceEvents(device)
' close the device
device.Close()
End Using
End Sub
''' <summary>
''' Image is acquiring.
''' </summary>
Private Shared Sub Device_ImageAcquiring(sender As Object, e As Vintasoft.Twain.ImageAcquiringEventArgs)
Dim fileExtension As String = "bmp"
Select Case e.FileFormat
Case Vintasoft.Twain.TwainImageFileFormat.Tiff
fileExtension = "tif"
Exit Select
Case Vintasoft.Twain.TwainImageFileFormat.Jpeg
fileExtension = "jpg"
Exit Select
End Select
e.Filename = System.IO.Path.Combine("d:\images\", String.Format("page{0}.{1}", _imageIndex, fileExtension))
End Sub
''' <summary>
''' Image is acquired.
''' </summary>
Private Shared Sub device_ImageAcquired(sender As Object, e As Vintasoft.Twain.ImageAcquiredEventArgs)
System.Console.WriteLine(String.Format("Image is saved to a file '{0}'.", System.IO.Path.GetFileName(e.Filename)))
_imageIndex += 1
End Sub
''' <summary>
''' Scan is completed.
''' </summary>
Private Shared Sub device_ScanCompleted(sender As Object, e As System.EventArgs)
System.Console.WriteLine("Scan is completed.")
End Sub
''' <summary>
''' Scan is canceled.
''' </summary>
Private Shared Sub device_ScanCanceled(sender As Object, e As System.EventArgs)
System.Console.WriteLine("Scan is canceled.")
End Sub
''' <summary>
''' Scan is failed.
''' </summary>
Private Shared Sub device_ScanFailed(sender As Object, e As Vintasoft.Twain.ScanFailedEventArgs)
System.Console.WriteLine(String.Format("Scan is failed: {0}.", e.ErrorString))
End Sub
''' <summary>
''' Scan is finished.
''' </summary>
Private Shared Sub device_ScanFinished(sender As Object, e As System.EventArgs)
Dim device As Vintasoft.Twain.Device = DirectCast(sender, Vintasoft.Twain.Device)
' unsubscribe from device events
UnsubscribeFromDeviceEvents(device)
' if device is not closed
If device.State <> Vintasoft.Twain.DeviceState.Closed Then
' close the device
device.Close()
End If
System.Console.WriteLine("Scan is finished.")
_isScanningFinished = True
End Sub
''' <summary>
''' Subscribes to the device events.
''' </summary>
Private Shared Sub SubscribeToDeviceEvents(device As Vintasoft.Twain.Device)
AddHandler device.ImageAcquiring, New System.EventHandler(Of Vintasoft.Twain.ImageAcquiringEventArgs)(AddressOf Device_ImageAcquiring)
AddHandler device.ImageAcquired, New System.EventHandler(Of Vintasoft.Twain.ImageAcquiredEventArgs)(AddressOf device_ImageAcquired)
AddHandler device.ScanCompleted, New System.EventHandler(AddressOf device_ScanCompleted)
AddHandler device.ScanCanceled, New System.EventHandler(AddressOf device_ScanCanceled)
AddHandler device.ScanFailed, New System.EventHandler(Of Vintasoft.Twain.ScanFailedEventArgs)(AddressOf device_ScanFailed)
AddHandler device.ScanFinished, New System.EventHandler(AddressOf device_ScanFinished)
End Sub
''' <summary>
''' Unsubscribes from the device events.
''' </summary>
Private Shared Sub UnsubscribeFromDeviceEvents(device As Vintasoft.Twain.Device)
RemoveHandler device.ImageAcquiring, New System.EventHandler(Of Vintasoft.Twain.ImageAcquiringEventArgs)(AddressOf Device_ImageAcquiring)
RemoveHandler device.ImageAcquired, New System.EventHandler(Of Vintasoft.Twain.ImageAcquiredEventArgs)(AddressOf device_ImageAcquired)
RemoveHandler device.ScanCompleted, New System.EventHandler(AddressOf device_ScanCompleted)
RemoveHandler device.ScanCanceled, New System.EventHandler(AddressOf device_ScanCanceled)
RemoveHandler device.ScanFailed, New System.EventHandler(Of Vintasoft.Twain.ScanFailedEventArgs)(AddressOf device_ScanFailed)
RemoveHandler device.ScanFinished, New System.EventHandler(AddressOf device_ScanFinished)
End Sub