我正在更新我刚被录用时写回的旧图像处理应用程序。我收到的一个请求是在应用程序上有一个“扫描”按钮,以便无需打开Epson Scan Manager或按一下按钮即可对图像进行扫描和处理(某些成像技术人员难以到达其扫描按钮从他们的座位上)。我已经在powershell中一起破解了一些东西,可以完成这项工作,并且可以轻松地链接到python应用程序中的按钮,但是我无法为DPI选择值。对于这些扫描,分辨率很重要,无论是出于面对客户还是出于程序方面的原因,它们必须至少为300 DPI,但它们始终以较低的分辨率保存,我似乎无法弄清楚如何进入和更改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中。无论我在哪里看,我似乎都找不到在Powershell中运行.net命令的语法指南,而该指南不仅仅涉及基本网络。
答案 0 :(得分:0)
所以我之所以回答这个问题,并不是因为严格意义上说已经解决了,而是因为我最终以不同的方式解决了潜在的问题。我直接使用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解决方案,那仍在等待比我自己更好的人来提供它。如果发生这种情况,我会很高兴地重新分配对勾标记。 ;)