详细内容请连接:
http://www.bjncut.com/question/tranpic.htm
各位高手快现身吧!!!

解决方案 »

  1.   

    这个并不太难,我写过类似的东西,你的问题可以分拆为以下几个部分:
    一:不规则透明贴图
    二:图像旋转
    三:简单的色彩处理我分别给你一些思路:
    一:使用TransparentBlt这个API就可以实现,但是用这个方法得不到你需要的“边缘羽化”效果,除非你再在边缘部分用一个“柔化”算法。
      还有一个方法是使用ALPHABLAND这个API,配合一个你做好的边框,将这个边框中间要透明的部分弄成黑色,不透明的地方一定要用高亮度色彩,在你需要“羽化”的边缘用过渡色,这样当你贴上去的时候中间黑色的部分就会看不见,而不透明的高亮度边缘会稍微暗一些(影响不大),并且在边缘部分也得到了你需要的“羽化”效果。二:像素操作,计算每一个像素的旋转后的坐标再贴回去(网上关于旋转图像的例子非常多)三:像素操作,根据每个像素的R G B,调整后重新输出,这里再稍微给你一些色彩方面的知识:三原色和三补色的关系,三原色为红绿蓝,三补色为黄品青,三原色加在一起是白色,三补色加在一起是黑色,原色和补色的对立关系为:黄--蓝,品--绿,青--红,加一个原色就是减一个补色,加一个补色就是减一个原色。原色和补色的生成关系为:黄=红+绿,品=红+蓝,青=蓝+绿,红=黄+品,绿=青+黄,蓝=青+品。鉴于你的二和三部分都需要对像素操作,可以在加载图像的时候将图像的像素读入一个数组,在计算的时候就是对数组中的数字计算了,因为如果每次都读一个像素计算一个像素画一个像素的话,你的程序会慢得不乏忍受。一般都是将整个图像读入后,直接在数组中计算再输出。如果图片不是很大,那使用PICTUREBOX自己带的POINT和PSET方法也可以操作像素,或是使用SETPIXELV和GETPIXEL这两个API(速度比上面那个稍微快一点点而已)如果图像比较大(比如1024*768或更大)那么上面的方法你一定会觉得速度不够,想要再快一些的话可以使用DIB方法来获得图像元素,不过这个就比较麻烦了。有一个现成的DIB输出和输入模块提供给你,参考一下:http://community.csdn.net/Expert/topic/3252/3252001.xml?temp=.1698725
      

  2.   

    有這方面的API,自己去找找吧
      

  3.   

    我这里只有其中的一部分内容,如果你觉得有用的话,请联系我。
    下载地址:http://sky300.com:88/hongsong/dagl.rar
    这个软件里面整合了一个图像处理软件,在安装程序的目录下面。不知道对你有没有用。
      

  4.   

    说明:两个女孩的图片原来是矩形的,程序启动后只有一个带背景图片的窗体,用户可以加载显示自己的图片,就象这两个女孩的图片,但是只显示椭圆部分,周边有羽化效果,其余部分透明,请问vb如何实现?另外还要对图片进行旋转、亮度、对比度、颜色通道等调节,并保留结果,请问如何实现?有无现成代码?愿直接购买。
    有代码我要分
    Option Explicit
    Const Pi = 3.14'  图像旋转任意角度
    Private Sub PicRotate1(angle As Integer)
        Dim x As Integer, y As Integer
        Dim x1 As Integer, y1 As Integer
        Dim xx As Double, yy As Double
        Dim X3 As Double, Y3 As Double
        Dim Radian As Double
        
         '  获得要旋转的弧度
        Radian = angle * Pi / 180
        '  设置坐标的度量单位并清除Picture2控件的内容
        Picture1.ScaleMode = vbPixels
        Picture2.ScaleMode = vbPixels
        Picture2.Cls
        
        '  将Picture2坐标进行反向旋转变换后读取Picture1中图
        For x = 0 To Picture2.ScaleWidth
            x1 = x - Picture2.ScaleWidth \ 2
            For y = 0 To Picture2.ScaleHeight
                y1 = y - Picture2.ScaleHeight \ 2
                xx = x1 * Cos(-Radian) - y1 * Sin(-Radian)
                yy = y1 * Cos(-Radian) + x1 * Sin(-Radian)
                Picture2.PSet (x, y), Picture1.Point(CInt(xx) + Picture1.ScaleWidth \ 2, CInt(yy) + Picture1.ScaleHeight \ 2)
            Next y
            DoEvents
        Next x
    End Sub'  图像旋转任意角度
    Private Sub PicRotate2(angle As Integer)
        Dim x As Integer, y As Integer
        Dim x1 As Double, y1 As Double
        Dim xx As Double, yy As Double
        Dim Radian As Double
        
        '  获得要旋转的弧度
        Radian = angle * Pi / 180
        '  设置坐标的度量单位并清除Picture2控件的内容
        Picture1.ScaleMode = vbPixels
        Picture2.ScaleMode = vbPixels
        Picture2.Cls
          
        '  坐标变换并绘出
        For x = 0 To Picture1.ScaleWidth
            x1 = x - Picture1.ScaleWidth \ 2
            For y = 0 To Picture1.ScaleHeight
                y1 = y - Picture1.ScaleHeight \ 2
                xx = x1 * Cos(Radian) - y1 * Sin(Radian)
                yy = y1 * Cos(Radian) + x1 * Sin(Radian)
                Picture2.PSet (CInt(xx) + Picture2.ScaleWidth \ 2, CInt(yy) + Picture2.ScaleHeight \ 2), Picture1.Point(x, y)
            Next y
            DoEvents
        Next x
    End Sub
    Private Sub Command1_Click()
        PicRotate1 Val(Text1.Text)
    End SubPrivate Sub Command2_Click()
        PicRotate2 Val(Text1.Text)
    End Sub
    '制作透明背景图片
    Option ExplicitPrivate Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
    Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
    Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long
    Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
    Private Declare Function GetObj Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long'  位图数据结构
    Private Type BITMAP
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
    End TypeDim cTransparent As Long'     将指定的源位图中指定颜色转为透明并在目标中显示出来
    '     DstDC 显示结果的目标设备场景句柄
    '     SrcDC 包含源位图的源设备场景句柄
    '     SrcX, SrcY, SrcW, SrcH 源位图的坐标和宽度、高度
    '     DstX, DstY  结果图左上角在目标设备场景中的坐标
    '     TransColor  指定要转换为透明的颜色
    Private Sub TransparentBlt(DstDC As Long, SrcDC As Long, ByVal SrcX As Integer, ByVal SrcY As Integer, ByVal SrcW As Integer, ByVal SrcH As Integer, DstX As Integer, DstY As Integer, TransColor As Long)
      
        Dim nRet As Long
        Dim MonoMaskDC As Long, hMonoMask As Long
        Dim MonoInvDC As Long, hMonoInv As Long
        Dim ResultDstDC As Long, hResultDst As Long
        Dim ResultSrcDC As Long, hResultSrc As Long
        Dim hPrevMask As Long, hPrevInv As Long
        Dim hPrevSrc As Long, hPrevDst As Long
        Dim OldBC As Long
        Dim OldMode As Integer
               
        '   创建单色屏蔽和反转色屏蔽设备场景
        MonoMaskDC = CreateCompatibleDC(DstDC)
        MonoInvDC = CreateCompatibleDC(DstDC)
        '   为与屏蔽设备场景相关的位图创建单色位图
        hMonoMask = CreateBitmap(SrcW, SrcH, 1, 1, ByVal 0&)
        hMonoInv = CreateBitmap(SrcW, SrcH, 1, 1, ByVal 0&)
        hPrevMask = SelectObject(MonoMaskDC, hMonoMask)
        hPrevInv = SelectObject(MonoInvDC, hMonoInv)
        '   创建保存目标图像的设备场景和位图
        ResultDstDC = CreateCompatibleDC(DstDC)
        ResultSrcDC = CreateCompatibleDC(DstDC)
        '   创建存放最终结果和源的位图
        hResultDst = CreateCompatibleBitmap(DstDC, SrcW, SrcH)
        hResultSrc = CreateCompatibleBitmap(DstDC, SrcW, SrcH)
        hPrevDst = SelectObject(ResultDstDC, hResultDst)
        hPrevSrc = SelectObject(ResultSrcDC, hResultSrc)
        '   将源拷贝到屏蔽设备场景
        OldBC = SetBkColor(SrcDC, TransColor)
        nRet = BitBlt(MonoMaskDC, 0, 0, SrcW, SrcH, SrcDC, SrcX, SrcY, vbSrcCopy)
        TransColor = SetBkColor(SrcDC, OldBC)
        '   创建屏蔽的反转
        nRet = BitBlt(MonoInvDC, 0, 0, SrcW, SrcH, MonoMaskDC, 0, 0, vbNotSrcCopy)
        '   将背景拷贝到结果中并创建透明效果
        nRet = BitBlt(ResultDstDC, 0, 0, SrcW, SrcH, DstDC, DstX, DstY, vbSrcCopy)
         
        '   通过AND、XOR操作绘制图像使之实现透明背景
        nRet = BitBlt(ResultDstDC, 0, 0, SrcW, SrcH, MonoMaskDC, 0, 0, vbSrcAnd)
        nRet = BitBlt(ResultSrcDC, 0, 0, SrcW, SrcH, SrcDC, SrcX, SrcY, vbSrcCopy)
        nRet = BitBlt(ResultSrcDC, 0, 0, SrcW, SrcH, MonoInvDC, 0, 0, vbSrcAnd)
        nRet = BitBlt(ResultDstDC, 0, 0, SrcW, SrcH, ResultSrcDC, 0, 0, vbSrcInvert)
        
        '   将结果拷贝到目标设备场景
        nRet = BitBlt(DstDC, DstX, DstY, SrcW, SrcH, ResultDstDC, 0, 0, vbSrcCopy)
            
        ' 释放资源
        hMonoMask = SelectObject(MonoMaskDC, hPrevMask)
        DeleteObject hMonoMask
        hMonoInv = SelectObject(MonoInvDC, hPrevInv)
        DeleteObject hMonoInv
        hResultDst = SelectObject(ResultDstDC, hPrevDst)
        DeleteObject hResultDst
        hResultSrc = SelectObject(ResultSrcDC, hPrevSrc)
        DeleteObject hResultSrc
        DeleteDC MonoMaskDC
        DeleteDC MonoInvDC
        DeleteDC ResultDstDC
        DeleteDC ResultSrcDC
    End SubPrivate Sub Command1_Click()
        Dim bmp As BITMAP
        
        '  获得图像的句柄
        GetObj pictSource.Picture, Len(bmp), bmp
        '  制作背景透明图片
        TransparentBlt pictDest.hdc, pictSource.hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, 0, 0, cTransparent
    End Sub'  打开图像文件
    Private Sub Command2_Click()
        CommonDialog1.FileName = ""
        CommonDialog1.ShowOpen
        If CommonDialog1.FileName <> "" Then
            pictSource.Picture = LoadPicture(CommonDialog1.FileName)
        End If
    End Sub'  拾取颜色
    Private Sub pictSource_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
        cTransparent = pictSource.Point(x, y)
        pictDest.Refresh
        Shape1.FillColor = cTransparent
    End Sub
      

  5.   

    还有问题写信 [email protected]