我有一个带有轨迹栏滑块控件的工具,用于调整图像的亮度、对比度、伽玛值等。
我试图在用户拖动滑块时实时更新我的图像。亮度和伽玛算法的速度是可以接受的(大约170ms)。但对比算法大约是380ms。
基本上我的表单是一个带有滑块的工具窗口。每次更新图像时,它都会向父级发送一个事件,以重绘新图像。工具窗口将原始未修改的图像锁定在内存中,因此我始终可以访问它的字节。所以基本上我每次更改滑块(例如对比度滑块)的 ValueChanged 事件时都会执行此操作。
- 工作(目标)位图的 LockBits 为 Format24bppRgb(原始位图为 Format32bppPArgb)
- Marshal.将位复制到 byte[] 数组
- 检查我正在执行哪个操作(选择了哪个滑块)
- 使用以下代码进行对比:
Code:
double newValue = 0;
double c = (100.0 + contrast) / 100.0;
c *= c;
for (int i = 0; i < sourcePixels.Length; i++)
{
newValue = sourcePixels[i];
newValue /= 255.0;
newValue -= 0.5;
newValue *= c;
newValue += 0.5;
newValue *= 255;
if (newValue < 0)
newValue = 0;
if (newValue > 255)
newValue = 255;
destPixels[i] = (byte)newValue;
}
我读过一次关于使用整数而不是浮点值来提高对比度速度的文章,但我找不到那篇文章了。
我尝试使用不安全的代码(指针),但实际上注意到速度下降。我认为这是因为代码使用嵌套 for 循环来迭代 x 和 y 而不是单个循环。
根据您运行此程序的机器,您的技术可能会非常慢。如果您使用没有 FPU 的 ARM 系统,则每个操作都将花费相当长的时间。由于您对每个字节应用相同的操作,因此更快的技术是为对比度级别创建一个 256 项查找表,然后通过该表转换每个图像字节。你的循环将如下所示:
byte contrast_lookup[256];
double newValue = 0;
double c = (100.0 + contrast) / 100.0;
c *= c;
for (int i = 0; i < 256; i++)
{
newValue = (double)i;
newValue /= 255.0;
newValue -= 0.5;
newValue *= c;
newValue += 0.5;
newValue *= 255;
if (newValue < 0)
newValue = 0;
if (newValue > 255)
newValue = 255;
contrast_lookup[i] = (byte)newValue;
}
for (int i = 0; i < sourcePixels.Length; i++)
{
destPixels[i] = contrast_lookup[sourcePixels[i]];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)