使用nTwain扫描

时间:2014-09-17 07:57:43

标签: c# twain scanning

我使用NuGet的nTwain lib执行扫描。 我捕获DataTransferred事件以保存结果图像。 我在结果中得到的是一些ImageInfo和null byte []大量的信息。

是否有人知道这个图书馆并且可以告诉我我做错了什么?

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

e仅来自ImageInfo

更新

参数截图如果有用......

enter image description here

1 个答案:

答案 0 :(得分:1)

对于NTwain,您应该拥有的不仅仅是该事件的ImageInfo。具体来说,e应该在屏幕截图中显示ImageInfoMemDataNativeData

我还没有做过很多但是我在控制台实用程序中做的是检查e.NativeData != IntPtr.Zero是否从DIB指针中拉出位图(Windows,它是Linux的TIFF) 。为此,我使用另一个依赖CommonWin32.dll。我相信这是与NTwain的首发解决方案包中包含的示例类似的方法(查看示例控制台,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);
    }