PhotoShop的自动色阶功能的实现
2009-06-01 15:25:04 来源:WEB开发网本文示例源代码或素材下载
关于自动色阶,用过PS的人应该都对他有所了解,在调整图像的视觉效果上这个调整滤镜的使用频率也是相当高的。关于其实现原理,网络上亦已经有不少人对其进行了探讨和研究,这里只是再简单的给有兴趣的人复习一下。
首先计算出一副图像的直方图,也就是每个色阶(0~255)所对应的像素点的个数,然后沿0阶->255阶方向找到最小色阶点Min(所谓最小色阶点即第一个在某一阶上有点数出现的阶数,如在0阶时为0点,1阶时为0点,2阶也为0点,3阶为10点,4阶为5点,...,那么最小点应为3阶), 同样最大值则是反方向从255阶开始第一个在某一阶上有点数出现的阶数Max.一般来讲,对以彩色图像最小色阶点=0,而最大色阶点为255。然后从最小色阶点开始选择整个图像总点数的5.5%的那一点做为新的最小点NewMin,再沿相反方向(即255阶->0阶方向)选择整个图像总点数的5.5%的那一点做为新的最大点NewMax,计两者之差为Differ,则每以原始像素点对应的新值可以按如下算法计算:
If Color <= NewMin Then
Color = 0
ElseIf Color >= NewMax Then
Color = 255
Else
Color = (Color - NewMin) * 255 / Differ
End If
这里我们假设你已经加载了一副24位真彩色图像到一个叫做Pic的图像容器中,并且为了方便我们设置其AutoRedraw为True,现在我们要对这副图像进行自动色阶的调整,除此之外,我们还希望处理的速度越快越好,首先我们请VB自带的Point和Pset函数站到一边去,他们处于图像处理的最低层(注意,不是最底层哦),接着,我们还要放弃对SetPixel和GetPixel的钟爱,因为他们和Point之流是一丘之貉。下一步,将目光瞄准GetBitmapBits和SetBitmapBits,哇,好名字,确实,这两个函数功能强大,但是我们不需要他们,因为他们是设备相关的,我不希望在我机器上能正常运行的程序在别人电脑上出现莫名其妙的效果。OK,还是请设备无关的函数GetDIBits,SetDIBits出山吧。关于这两个函数的使用方法,我不想详谈,但是你们可以记住,我们调用他们只是想快速的获得图像的点阵数据而已。
更多精彩
赞助商链接