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

mpgws1up  于 2023-04-22  发布在  Windows
关注(0)|答案(2)|浏览(262)

我正在更新一个旧的图像处理应用程序,我第一次被录用时写了回信。我收到的一个请求是在应用程序上有一个“扫描”按钮,这样图像就可以被扫描和处理,而不必打开爱普生扫描管理器或按下按钮(一些成像技术人员很难从座位上够到他们的扫描按钮)。我已经在powershell中破解了一些东西,可以完成这项工作,并且可以轻松地链接到python应用程序中的按钮,但我不能选择DPI的值。分辨率对这些扫描很重要,无论是面向客户还是编程原因,并且它们必须是至少300DPI,但他们总是以低得多的分辨率保存,我似乎无法弄清楚如何进入并更改扫描仪的WIA设置。我可以控制文件保存后的压缩,但我无法控制扫描仪实际扫描图片时使用的分辨率。我已经找到了this资源,但不知道如何实际实现这些设置的更改。我们只使用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中运行.net命令的语法指南,而不仅仅是处理基本的网络。

wgeznvg7

wgeznvg71#

所以我回答这个问题,不是因为它已经解决了,严格来说,而是因为我最终以不同的方式解决了潜在的问题。我用C#重写了需要这样做的应用程序,直接使用WIA来完成扫描任务。这种方法有新的问题,但我可以获得扫描并调整图像大小和分辨率。由于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解决方案,还在等待比我更擅长的人来提供它。如果发生这种情况,我会很高兴地重新分配复选标记。)

dgenwo3n

dgenwo3n2#

我偶然发现了你的帖子,寻找改变默认300DPI扫描分辨率的解决方案。经过几个小时的搜索,我想出了一个简单而愚蠢的方法,很难相信。在你Transfer你的图像对象之前,添加以下行为600 DPI $item.properties("6147").Value = 600$item.properties("6148").Value = 600
下面是我的完整代码

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

$item = $device.Items
$item.Item(1).properties("6147").Value = 600
$item.Item(1).properties("6148").Value = 600

$image = $item.Item(1).Transfer() 

$imageProcess = new-object -ComObject WIA.ImageProcess
$imageProcess.Filters.Add($imageProcess.FilterInfos.Item("Convert").FilterID)
$wiaFormatJPG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
$imageProcess.Filters.Item(1).Properties.Item("FormatID").Value = $wiaFormatJPG

$image = $imageProcess.Apply($image)

$image.SaveFile("C:\PATH\test.jpg")

相关问题