对于 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);
}