我使用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
。
更新
参数截图如果有用......
答案 0 :(得分:1)
对于NTwain,您应该拥有的不仅仅是该事件的ImageInfo。具体来说,e
应该在屏幕截图中显示ImageInfo
,MemData
和NativeData
。
我还没有做过很多但是我在控制台实用程序中做的是检查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);
}