因此,我一直致力于更新一个相当简单和特定任务的图像处理应用程序,这是我不久前推出的。由于成像技术人员倾向于使用这个软件来处理扫描仪的设置,要求程序进行不必要的更改,有时是有意的,有时是偶然的,我想在更新中添加一个扫描按钮,以标准化图像分辨率和颜色设置,以增强一致性,同时减少程序雇员必须打开和切换的数量。最初,我试图通过原始python程序调用的Powershell脚本来完成这一任务。这是一场噩梦,不是我现在正在做的事情,也不是我就这个问题发表的问题的翻版。所以,关于这个问题:
我没有继续使用python和Powershell,而是用C#编写了升级的应用程序,使用WIA处理扫描仪,使用Aforge.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);
}如果需要的话,我也可以包括后处理代码,但是它有很多(毕竟它是应用程序的主要功能),它真正做的就是获取一堆关于图像内容的信息,然后旋转并裁剪它。除了旋转和裁剪之外,它不应该对图像的实际外观产生影响,所以我现在不讨论这个部分。如果这个代码的片段是必要的,让我知道,我会张贴他们。感谢您能提供的任何帮助!
发布于 2019-03-12 02:02:29
你需要减少对比度和增加亮度,以获得预期的结果。
根据这个Microsoft WIA页面。有效范围为-1000至1000。
对buttonScan_Click方法进行以下调整:
// ...
int width_pixel = 3510;
int height_pixel = 5100;
int color_mode = 1;
// Add the following two lines
int brightness = 500;
int contrast = -500;
// Change the 0, 0 to brightness, contrast in the next line.
AdjustScannerSettings(scannerItem, resolution, 0, 0, width_pixel, height_pixel, brightness, contrast, color_mode);您必须根据结果调整值。
https://stackoverflow.com/questions/55049546
复制相似问题