VB实现PS的自动色阶功能 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

   

    关于自动色阶,用过PS的人应该都对他有所了解,在调整图像的视觉效果上这个调整滤镜的使用频率也是相当高的,

VB实现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出山吧。关于这两个函数的使用方法,我不想详谈,但是你们可以记住,我们调用他们只是想快速的获得图像的点阵数据而已。

    为了大家理解方便,这里我们设置图像的数据为一二维的RGBQUAD结构体,该结构体由四个分量组成,分别表示了颜色空间的Red,Green,Blue,Alpha分量(有的地方最后一个变量名为Reserved,但这不妨碍我们)。其中的Alpha因为VB的StdPicture对象不支持,我们不予以关心。

    好了,下面给出获取PictureBox控件中图像数据的函数,以及怎么样把图像数据绘制到PictureBox中去。

    模块中的代码:

    Option Explicit

    '***************************模仿PS魔术棒*********************************

    '** 作者 : laviewpbt

    '**开发时间 : 2008.7.1

    '** 最后修改时间 : 2008.8.28

    '** 联系方式 : QQ:33184777

    '** E-MAIL : laviewpbt@sina.com

    '** All Rights Resered

    '***********************************************************************

    Public Type BITMAPFILEHEADER

    bfType As Integer

    bfSize As Long

    bfReserved1 As Integer

    bfReserved2 As Integer

    bfOffBits As Long

    End Type

    Public Type Bitmap

    bmType As Long

    bmWidth As Long

    bmHeight As Long

    bmWidthBytes As Long

    bmPlanes As Integer

    bmBitsPixel As Integer

    bmBits As Long

    End Type

    Public Type BITMAPINFOHEADER '40 bytes

    biSize As Long 'BITMAPINFOHEADER结构的大小

    biWidth As Long

    biHeight As Long

    biPlanes As Integer '设备的为平面数,现在都是1

    biBitCount As Integer '图像的颜色位图

    biCompression As Long '压缩方式

    biSizeImage As Long '实际的位图数据所占字节

    biXPelsPerMeter As Long '目标设备的水平分辨率

    biYPelsPerMeter As Long '目标设备的垂直分辨率

    biClrUsed As Long '使用的颜色数

    biClrImportant As Long '重要的颜色数,

电脑资料

VB实现PS的自动色阶功能》(https://www.unjs.com)。如果该项为0,表示所有颜色都是重要的

    End Type

    Public Type RGBQUAD '只有bibitcount为1,2,4时才有调色板

    Blue As Byte '蓝色分量

    Green As Byte '绿色分量

    Red As Byte '红色分量

    Reserved As Byte '保留值

    End Type

    Public Type BITMAPINFO

    bmiHeader As BITMAPINFOHEADER

    bmiColors As RGBQUAD

    End Type

    Public Const BI_RGB = 0&

    Public Const DIB_RGB_COLORS = 0&

    Public Const IMAGE_BITMAP = 0&

    Public Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long

    Public Declare Function GetGDIObject Lib "gdi32.dll" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, ByRef lpObject As Any) As Long

    Public Declare Function SetDIBits Lib "gdi32" (ByVal Hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long

最新文章