Для 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);
}