|
楼主 |
发表于 2022-3-14 23:41
|
显示全部楼层
本帖最后由 小fisher 于 2022-3-16 21:19 编辑
学习了半晚上Tanner Helland大神的PhotoDemon源代码(https://github.com/tannerhelland/PhotoDemon,顺便说一句,真是个各种图像处理算法的宝库,而且源码是VB6写的,强烈推荐!)
代码没来得及注释,先简单概括一下原理:1)根据指定的色温计算出一个对应的颜色值rgbTemp;
2)遍历每个像素,取得该像素的初始亮度值L(即R、G、B三色最大、最小值的平均数);
3)用每个像素的颜色值与rgbTemp分别混合【本质上是三原色分别加权平均,原像素颜色和rgbTemp的权重分别为(1-strength/100)和strength/100】,算出来一个新的颜色值rgbNew;
4)计算rgbNew对应的色相、饱和度、亮度,用rgbNew 的色相、饱和度和初始亮度L换算出最终的rgb值赋给对应的像素点
这样即可显示出色温效果,同时保持每个像素点的原始亮度。
连抄带拼凑,效果还算可以,源码奉上:
调整照片色温.rar
(67.48 KB, 下载次数: 16)
=====
3月16日更新
调整照片色温1.rar
(76.48 KB, 下载次数: 17)
修正几处不合理代码:
1. 将类似Dim h, s, l as Single修改为Dim h as Single, s as Single, l as Single,纯属低级错误
2. 原来代码中两层循环中嵌套复杂运算,修改为在循环之前进行尽量少次数的复杂运算,在两次循环内查表,将复杂浮点运算的次数由x(图片宽度) * y(图片高度)次减少为256 *3=768次。
修改前代码:
For x = 1 To lWidth
For y = 1 To lHeight
l = getLightness(arrRGB(x, y).rgbRed, arrRGB(x, y).rgbGreen, arrRGB(x, y).rgbBlue)
r = arrRGB(x, y).rgbRed * (1 - strength / 100) + rgbTemp.Red * strength / 100
g = arrRGB(x, y).rgbGreen * (1 - strength / 100) + rgbTemp.Green * strength / 100
b = arrRGB(x, y).rgbBlue * (1 - strength / 100) + rgbTemp.Blue * strength / 100
……
修改后代码:
Dim arrR(0 To 255) As Integer
Dim arrG(0 To 255) As Integer
Dim arrB(0 To 255) As Integer
rgbTemp = RGBfromTemperature(temperature)
For i = 0 To 255
arrR(i) = i * (1 - strength / 100) + rgbTemp.rgbRed * strength / 100
arrG(i) = i * (1 - strength / 100) + rgbTemp.rgbGreen * strength / 100
arrB(i) = i * (1 - strength / 100) + rgbTemp.rgbBlue * strength / 100
Next
For x = 1 To lWidth
For y = 1 To lHeight
l = getLightness(arrRGB(x, y).rgbRed, arrRGB(x, y).rgbGreen, arrRGB(x, y).rgbBlue)
r = arrR(arrRGB(x, y).rgbRed)
g = arrG(arrRGB(x, y).rgbGreen)
b = arrB(arrRGB(x, y).rgbBlue)
……
3. 借鉴https://club.excelhome.net/forum.php?mod=viewthread&tid=1615549帖子中的技巧,将clsImage的创建方式修改为更简洁和舒服的:
Set oImage = clsImage.CreateFromPicture( [Picture对象] )
或Set oImage = clsImage.CreateFromFile( [图片文件路径] )
|
评分
-
2
查看全部评分
-
|