How to scan using NTwain

1.9k Views Asked by At

I am new to learning about scanners and tried a bunch of packages but ended up on NTwain a NuGet library. I am struggling on how to start my scanner and save the images using the api. How can I understand it? Also here's what I have so far.

Edit

I found out how to enable the scan and save it but for some reason I can't get both sides of the paper? I don't know if my encoder is wrong trying to save it as a multi-tiff or its something you have to set using NTwain.

Edit 2

I figured it out. I didn't know scanner see double sided as "Duplex" -> myDS.Capabilities.CapDuplexEnabled.SetValue(BoolType.True);

public static void GetScanner()
    {
        // Create appId
        var appId = TWIdentity.CreateFromAssembly(DataGroups.Image, Assembly.GetExecutingAssembly());
        // Attach
        var session = new TwainSession(appId);

        List<Image> scannedImages = new List<Image>();
        session.TransferReady += (s, e) =>
        {
            Debug.Print("TransferReady is a go.");
        };
        session.DataTransferred += (s, e) =>
        {
            if (e.NativeData != IntPtr.Zero)
            {
                // Handle image data
                if (e.NativeData != IntPtr.Zero)
                {
                    var stream = e.GetNativeImageStream();
                    if (stream != null)
                    {
                     //Save Image to list
                     scannedImages.Add(Image.FromStream(stream));
                    }
                }
            }
        };

        // Open it
        session.Open();

        // Open the first source found
        DataSource myDS = session.FirstOrDefault();
        myDS.Open();
        myDS.Capabilities.CapDuplexEnabled.SetValue(BoolType.True);

        // Start Scan
        myDS.Enable(SourceEnableMode.NoUI, false, IntPtr.Zero);

        //Close Session
        myDS.Close();

        // Save Images to specific folder as tiffs
        int n = 0;
        foreach(Image image in scannedImages)
        {
            //Get the codec for tiff files
            ImageCodecInfo info = null;
            foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders())
                if (ice.MimeType == "image/tiff")
                    info = ice;
            //Save as Multi-Page Tiff
            System.Drawing.Imaging.Encoder enc = System.Drawing.Imaging.Encoder.SaveFlag;
            EncoderParameters ep = new EncoderParameters(1);
            ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
            //Construct save path
            var saveFolderPath = @"C:\Projects\SavingMethods\SavingMethods\ScannedImages\";
            string fileName = "Testfile" + n + ".tiff";
            var completedFilePath = Path.Combine(saveFolderPath, fileName);
            //Save Image
            image.Save(completedFilePath, info, ep);
            n++;
        }
    }
1

There are 1 best solutions below

0
CJP On BEST ANSWER

I ended up figuring it out by myself but would like to thank ckuri for the comment as his link did help me immensely.

public static void GetScanner()
{
    // Create appId
    var appId = TWIdentity.CreateFromAssembly(DataGroups.Image, 
    Assembly.GetExecutingAssembly());
    // Attach
    var session = new TwainSession(appId);

    List<Image> scannedImages = new List<Image>();
    session.TransferReady += (s, e) =>
    {
        Debug.Print("TransferReady is a go.");
    };
    session.DataTransferred += (s, e) =>
    {
        if (e.NativeData != IntPtr.Zero)
        {
            // Handle image data
            if (e.NativeData != IntPtr.Zero)
            {
                var stream = e.GetNativeImageStream();
                if (stream != null)
                {
                 //Save Image to list
                 scannedImages.Add(Image.FromStream(stream));
                }
            }
        }
    };

    // Open it
    session.Open();

    // Open the first source found
    DataSource myDS = session.FirstOrDefault();
    myDS.Open();
    myDS.Capabilities.CapDuplexEnabled.SetValue(BoolType.True);

    // Start Scan
    myDS.Enable(SourceEnableMode.NoUI, false, IntPtr.Zero);

    //Close Session
    myDS.Close();

    // Save Images to specific folder as tiffs
    int n = 0;
    foreach(Image image in scannedImages)
    {
        //Get the codec for tiff files
        ImageCodecInfo info = null;
        foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders())
            if (ice.MimeType == "image/tiff")
                info = ice;
        //Save as Multi-Page Tiff
        System.Drawing.Imaging.Encoder enc = System.Drawing.Imaging.Encoder.SaveFlag;
        EncoderParameters ep = new EncoderParameters(1);
        ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
        //Construct save path
        var saveFolderPath = @"C:\Projects\SavingMethods\SavingMethods\ScannedImages\";
        string fileName = "Testfile" + n + ".tiff";
        var completedFilePath = Path.Combine(saveFolderPath, fileName);
        //Save Image
        image.Save(completedFilePath, info, ep);
        n++;
    }
}