繁体   English   中英

如何在Powershell中更改扫描仪DPI设置?

[英]How to change scanner DPI settings in powershell?

我正在更新第一次雇用时写回的旧图像处理应用程序。 我收到的一个请求是在应用程序上有一个“扫描”按钮,以便无需打开Epson Scan Manager或按一下按钮即可对图像进行扫描和处理(某些成像技术人员难以到达其扫描按钮从他们的座位上)。 我已经在powershell中一起破解了一些东西,可以完成这项工作,并且可以轻松地链接到python应用程序中的按钮,但是我无法为DPI选择值。 对于这些扫描,分辨率很重要,无论是出于面对客户还是出于程序方面的原因,它们必须至少为300 DPI,但它们始终以较低的分辨率保存,我似乎无法弄清楚如何进入和更改WIA扫描仪的设置。 保存文件后,我就可以控制压缩,但是无法控制扫描仪实际扫描图片时使用的分辨率。 我已经找到了资源,但不知道如何实际实施更改这些设置。 我们仅使用jpeg,并且这些扫描仪仅用于扫描产品,没有应用过滤器或蒙版,因此它应该非常简单,但是我只需要弄清楚这个DPI即可。 这是我到目前为止的内容:

Set-ExecutionPolicy RemoteSigned

$deviceManager = new-object -ComObject WIA.DeviceManager
$device = $deviceManager.DeviceInfos.Item(1).Connect()

$imageProcess = new-object -ComObject WIA.ImageProcess

$wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"

foreach ($item in $device.Items) {
    $image = $item.Transfer() 
}

$Basepath = Join-Path -Path "C:\Users" -ChildPath $env:username
$NewPath = Join-Path -Path $BasePath -ChildPath "Pictures\My Scans\scan daemon"
$filename = Join-Path -Path $NewPath -ChildPath "Scan {0}.jpg"

$index = 0
while (test-path ($filename -f $index)) {[void](++$index)}
$filename = $filename -f $index

$image.SaveFile($filename)

我可以进行扫描并保存文件,但是始终以低分辨率保存它。 这是一个问题,这既是因为我们的客户希望看到高分辨率的图像,又是因为我的图像处理应用程序期望的是特定尺寸的图像,因此如果我们愿意使用它们,甚至将无法在这些图像上正常工作。 我觉得这应该很简单,甚至可能只有一行代码,但是我对Windows或Powershell并不十分熟悉,并且目前对于该行代码是什么或如何找到它感到茫然。

本质上,我只想要一种方法:

SetWIAProperty(scannnerItem.Properties, WIA_HORIZONTAL_SCAN_RESOLUTION_DPI, 300);
SetWIAProperty(scannnerItem.Properties, WIA_VERTICAL_SCAN_RESOLUTION_DPI, 300);

在PowerShell中。 不管我在哪里看,我似乎都找不到在Powershell中运行.net命令的语法指南,而该指南不仅仅涉及基本的网络。

因此,我之所以要回答这个问题,并不是严格说来是因为已经解决了,而是因为我最终以不同的方式解决了潜在的问题。 我直接使用WIA重新编写了需要在C#中执行此操作的应用程序,以完成扫描任务。 这种方法存在新问题,但是我可以进行扫描并调整图像大小和分辨率。 由于Powershell可以使用.Net程序集,甚至可以使用自定义程序集,因此,如果我决定继续使用Powershell,则可以通过powershell运行扫描代码,但是在.Net中重写所有内容更为明智,因为这样做因此也改善了程序的其他功能。 无论如何,这是我的.Net代码,以防万一其他人想要做这样的事情:

    private static void AdjustScannerSettings(IItem scannerItem, int scanResolutionDPI, int scanStartLeftPixel, int scanStartTopPixel, int scanWidthPixels, int scanHeightPixels, int brightnessPercents, int contrastPercents, int colorMode)
    {
        const string WIA_SCAN_COLOR_MODE = "6146";
        const string WIA_HORIZONTAL_SCAN_RESOLUTION_DPI = "6147";
        const string WIA_VERTICAL_SCAN_RESOLUTION_DPI = "6148";
        const string WIA_HORIZONTAL_SCAN_START_PIXEL = "6149";
        const string WIA_VERTICAL_SCAN_START_PIXEL = "6150";
        const string WIA_HORIZONTAL_SCAN_SIZE_PIXELS = "6151";
        const string WIA_VERTICAL_SCAN_SIZE_PIXELS = "6152";
        const string WIA_SCAN_BRIGHTNESS_PERCENTS = "6154";
        const string WIA_SCAN_CONTRAST_PERCENTS = "6155";
        SetWIAProperty(scannerItem.Properties, "4104", 24);
        SetWIAProperty(scannerItem.Properties, WIA_HORIZONTAL_SCAN_RESOLUTION_DPI, scanResolutionDPI);
        SetWIAProperty(scannerItem.Properties, WIA_VERTICAL_SCAN_RESOLUTION_DPI, scanResolutionDPI);
        SetWIAProperty(scannerItem.Properties, WIA_HORIZONTAL_SCAN_START_PIXEL, scanStartLeftPixel);
        SetWIAProperty(scannerItem.Properties, WIA_VERTICAL_SCAN_START_PIXEL, scanStartTopPixel);
        SetWIAProperty(scannerItem.Properties, WIA_HORIZONTAL_SCAN_SIZE_PIXELS, scanWidthPixels);
        SetWIAProperty(scannerItem.Properties, WIA_VERTICAL_SCAN_SIZE_PIXELS, scanHeightPixels);
        SetWIAProperty(scannerItem.Properties, WIA_SCAN_BRIGHTNESS_PERCENTS, brightnessPercents);
        SetWIAProperty(scannerItem.Properties, WIA_SCAN_CONTRAST_PERCENTS, contrastPercents);
        SetWIAProperty(scannerItem.Properties, WIA_SCAN_COLOR_MODE, colorMode);
    }
    private static void SetWIAProperty(IProperties properties, object propName, object propValue)
    {
        Property prop = properties.get_Item(ref propName);
        prop.set_Value(ref propValue);
    }
    private void buttonScan_Click(object sender, EventArgs e)
    {
        var deviceManager = new DeviceManager();
        DeviceInfo firstScannerAvailable = null;
        for (int i = 1; i <= deviceManager.DeviceInfos.Count; i++)
        {
            if (deviceManager.DeviceInfos[i].Type != WiaDeviceType.ScannerDeviceType)
            {
                continue;
            }
            firstScannerAvailable = deviceManager.DeviceInfos[i];
            break;
        }
        var device = firstScannerAvailable.Connect();
        var scannerItem = device.Items[1];
        int resolution = 300;
        int width_pixel = 3510;
        int height_pixel = 5100;
        int color_mode = 1;
        AdjustScannerSettings(scannerItem, resolution, 0, 0, width_pixel, height_pixel, 0, 0, color_mode);

        var imageFile = (ImageFile)scannerItem.Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}");

        var pathbase = Path.Combine(pictures, basedaemonpath);
        string filebase = DateTime.Now.ToString("dd-MM-yyyy-hh-mm-ss-fffffff") + ".jpg";
        var path = Path.Combine(pathbase, filebase);

        WIA.ImageProcess myip = new WIA.ImageProcess();  // use to compress jpeg.
        myip.Filters.Add(myip.FilterInfos["Convert"].FilterID);
        myip.Filters[1].Properties["FormatID"].set_Value("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}");
        myip.Filters[1].Properties["Quality"].set_Value(84);

        ImageFile image = myip.Apply(imageFile);

        image.SaveFile(path);
    }

这仍然有我自己要解决的一些问题,但是除非您需要真正的照片质量的图像,否则它将可以正常工作。 当然,您需要更改路径和变量名以适合您的项目,然后,如果要在Powershell中调用该模块,则可以将其编译为.exe文件,然后像其他任何文件一样直接调用它,或者您可以直接将其作为.Net对象使用:

Create-Object -TypeName AdjustScannerSettings

再说一次,我并没有最终做到这一点,所以我不会将这个问题本身称为“已解决”,但是如果我决定继续使用它来调用设置更改,那么此代码将在我的C#应用​​程序中运行,并且将在Powershell中运行。 如果其他任何人都尝试使用Powershell进行扫描,那么如果您愿意编写.Net代码来执行此操作,则应该可以使用。 如果您想要一个纯Powershell解决方案,那仍在等待比我自己更好的人来提供它。 如果发生这种情况,我会很高兴地重新分配对勾标记。 ;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM