2014-09-17 4 views
0

Выполняю сканирование с использованием nTwain lib из NuGet. Я поймаю событие DataTransferred, чтобы сохранить результат. В результате у меня есть некоторый массив данных ImageInfo и null byte [].Сканирование с использованием nTwain

Кто-нибудь знает об этой библиотеке и может сказать мне, что я делаю что-то неправильно?

void session_DataTransferred(object sender, NTwain.DataTransferredEventArgs e) 
{ 
    Image img = ImageFromBytes(e.MemoryData); 
    myDS.Close(); 
    session.Close(); 
} 

Но e приходит только с ImageInfo.

Update

скриншот Довод если полезно ...

enter image description here

ответ

1

Для NTwain, вы должны иметь больше, чем просто ImageInfo для этого события. В частности, e должен иметь ImageInfo, MemData и NativeData, как вы показываете на скриншоте.

Я не очень много сделал с ним, но то, что я делаю в консольной утилите, - проверить, e.NativeData != IntPtr.Zero и вытащить растровое изображение из указателя DIB (Windows, это TIFF для Linux). Для этой цели я использую другую зависимость CommonWin32.dll. Я считаю, что это аналогичный метод для примеров, включенных в пакет решений NTwain (посмотрите в разделе «Тесты» для примера Console, WinForm и проекта WPF).

Если я хочу сохранить другой тип файла, я делаю кодировку в этой точке. Вы можете сохранить System.Drawing.Image с заданным кодированием. Очевидно, что это может быть намного лучше (установите тип и сжатие, чтобы сделать передачу меньше), но это рабочий пример.

if (e.NativeData != IntPtr.Zero) 
{ 
    Bitmap img = null; 
    if (this._commands.CheckForDebug()) 
    { 
     Console.WriteLine("Image data transferred."); 
    } 
    //Need to save out the data. 
    img = e.NativeData.GetDrawingBitmap(); 

    if (img != null) 
    { 
     string fileName = "RandomFileName."; 

     string fileType = this._commands.GetFileType(); 

     switch (fileType) 
     { 
      case "png": 
       fileName += "png"; 
       ImageExtensions.SavePNG(img, fileName, 50L); 
       break; 
      case "jpeg": 
       fileName += "jpeg"; 
       ImageExtensions.SaveJPEG(img, fileName, 50L); 
       break; 
      default: 
       fileName += "png"; 
       ImageExtensions.SavePNG(img, fileName, 50L); 
       break; 
      } 
    } 
} 

public static void SaveJPEG(Image img, string filePath, long quality) 
    { 
     var encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); 
     img.Save(filePath, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 
Смежные вопросы