如何用VB把一张图片裁剪成扇形呢?    
我这里有段代码,是用正方形或者长方型进行裁剪的.怎么修改一下,才可以用扇型裁剪一幅图片呢?最好是源码,因为我是做JAVA的,对VB不懂,还请赐教! 
非常的感谢!
早上问过了,没有人理我,是不是分数不够? 如果问题解决了,再追加100分.
 
http://topic.csdn.net/u/20081023/11/c5b0048a-27a3-46c3-864d-db33cdbfdaed.html

解决方案 »

  1.   

    试试在原来显示矩形剪裁框的时候用两条line,两条圆弧来模拟扇形剪裁框,真正剪裁的时候,在后台用一个扇形的mask来剪裁
      

  2.   

    实际操作的时候,甚至可以试试在内存dc里利用mask图直接得到扇形剪裁框,这样应该更省事,起码不需要计算line跟弧线的坐标。
      

  3.   

    如果你有能力开发出一个扇形剪裁工具来,就已经是专家了!
    标准的剪裁区都是矩形的,用纯API就可做到。非标准的恐怕有要到数学知识,比如:圆的方程,三角函数。在一个半圆内可以画分出若干小矩形来。只是一些猜想,没做过。
      

  4.   

    各位大侠,矩形裁剪图片的代码如下(怎么修改成用扇型裁剪图片呢?):
    Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDC As Long) As Long
    Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
    Private Declare Function EmptyClipboard Lib "user32" () As Long
    Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
    Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
    Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
    Private 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 CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As Long) As Long
    Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) 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 CloseClipboard Lib "user32" () As Long
    Dim OriginalX    As Single
    Dim OriginalY    As Single
    Dim NewX    As Single
    Dim NewY    As Single
    Dim Status    As String
    Dim rc    As RECT
    Dim ptInPic    As BooleanPrivate Type RECT
            left  As Long
            top  As Long
            right  As Long
            bottom  As Long
    End TypePrivate Sub ScrnCap(Lt, top, Rt, Bot)
    rWidth = Rt - Lt
    rHeight = Bot - top
    SourceDC = CreateDC("DISPLAY", 0, 0, 0)
    DestDC = CreateCompatibleDC(SourceDC)
    BHandle = CreateCompatibleBitmap(SourceDC, rWidth, rHeight)
    SelectObject DestDC, BHandle
    BitBlt DestDC, 0, 0, rWidth, rHeight, SourceDC, Lt, top, &HCC0020
    Wnd = Screen.ActiveForm.hWnd
    OpenClipboard Wnd
    EmptyClipboard
    SetClipboardData 2, BHandle
    CloseClipboard
    DeleteDC DestDC
    ReleaseDC DHandle, SourceDC
    End SubPrivate Sub Command1_Click()
     Me.Picture = CaptureScreen
    End SubPrivate Sub Picture1_DblClick()
    Dim T, L, r, BL = (Me.left + Me.Picture1.left + Shape1.left + 90) / Screen.TwipsPerPixelX
    T = (Me.top + Me.Picture1.top + Shape1.top + 375) / Screen.TwipsPerPixelYr = Shape1.Width / Screen.TwipsPerPixelX
    B = Shape1.Height / Screen.TwipsPerPixelYShape1.Visible = False
    Picture1.Refresh
    ScrnCap L, T, L + r, T + B
    Picture2 = Clipboard.GetData()
    Shape1.Visible = TrueEnd SubPublic Sub ScrnCapx(left As Long, top As Long, right As Long, bottom As Long)
            Dim rWidth   As Long
            Dim rHeight   As Long
            Dim SourceDC   As Long
            Dim DestDC   As Long
            Dim BHandle   As Long
            Dim Wnd   As Long
            Dim DHandle   As Long
            rWidth = right - left
            rHeight = bottom - top
            SourceDC = CreateDC("DISPLAY ", 0, 0, 0)
            DestDC = CreateCompatibleDC(SourceDC)
            BHandle = CreateCompatibleBitmap(SourceDC, rWidth, rHeight)
            SelectObject DestDC, BHandle
            BitBlt DestDC, 0, 0, rWidth, rHeight, SourceDC, left, top, &HCC0020
            Wnd = GetDesktopWindow
            OpenClipboard Wnd
            EmptyClipboard
            SetClipboardData 2, BHandle
            CloseClipboard
            DeleteDC DestDC
            ReleaseDC DHandle, SourceDC
    End SubPrivate Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    Shape1.top = y - (Shape1.Height / 2)
    Shape1.left = x - (Shape1.Width / 2)
    End Sub
      Private Sub Form_Load()
        Set Picture1.Picture = LoadPicture("c:\back.jpg")
      End Sub
      
      

  5.   


    图片贴不上来?!未裁剪之前的图片: 
    http://album.hi.csdn.net/views/photo/235127用扇型裁剪之后的效果图: 
    http://album.hi.csdn.net/views/photo/235128用扇型裁剪图片时的扇型:
    http://album.hi.csdn.net/views/myalbums
      

  6.   

    不好意思,图片贴不上来,只能麻烦你到下边的地址去看了.未裁剪之前的图片: 
    http://album.hi.csdn.net/views/photo/235127 用扇型裁剪之后的效果图: 
    http://album.hi.csdn.net/views/photo/235128 用扇型裁剪图片时的扇型: 
    http://album.hi.csdn.net/views/myalbums
      

  7.   

    或者到我空间的查看我的像册,可以看到.
    http://album.hi.csdn.net/views/myalbums
      

  8.   

    mask图你都自己做出来了,还有什么呢?把mask图中间填白,再跟源图像and操作就可以了,至于显示剪裁框也可以用类似的方法。剩下的就是简单的坐标计算了。
      

  9.   

    弄了一下,不知符合不符合楼主的要求,如下图:代码比较多,打包放在了Mofile上,提取码:9364855036798474
    目前的背景颜色只能设定成某种颜色,正在实现保存为背景为透明色的32位位图。(其实代码里已有这个功能,具体实现还要加一些代码,挺麻烦,明天吧,弄完了再上传)
      

  10.   

    Soyokaze:
       非常感谢呀.
       裁剪之后的效果图就是这个样子的.
       "目前的背景颜色只能设定成某种颜色,正在实现保存为背景为透明色的32位位图",你的意思是在保存的时候,扇形图以外的背景色设置为透明的吗? 这样也比较好,打印的时候,只打印有颜色的扇型部位. 
       有个问题,这个扇型截图的时候,是固定在一幅图片的某个位置(比如:中间)截图的呢还是灵活的可以随意的选择图片的某个位置截图的?
       
       我先看看代码啊.
      

  11.   

    "代码比较多,打包放在了Mofile上,提取码:9364855036798474"
    请问"Mofile"在什么地方?
      

  12.   


    你的提取码好象有问题.
    http://pickup.mofile.com/9364855036798474
    你访问的共享文件提取码 9364855036798474 不正确,可能的原因是: 
    1. 此共享文件的提取码已过期 
    2. 提供给您此共享文件的朋友取消了共享或者删除了此文件 
    3. 输入的提取码(16位数字)不正确。
      

  13.   

    Soyokaze:
      好了就说一声,我毕恭毕敬的等着的.
      

  14.   

    好了,新的提取码是:8190196464076381
    以经加入了保存为32位位图的功能。(Windows自带的浏览器看不出透明效果,需要XnView等看图软件或自己转换为png格式才可以看到)
    另外这个只是个演示版,仅仅提供了思路。
      

  15.   


    哈哈,平常很少编程,但是我可以做出来,没想到不知不觉达到了专家水平了。
    可以通过数学模型做任何形状的的mask,然后与原来的图片做位相应的位运算,可以剪裁任何形状。
      

  16.   

    l = (Me.Left + Me.Picture1.Left + 90) / Screen.TwipsPerPixelX
        t = (Me.Top + Me.Picture1.Top + 75) / Screen.TwipsPerPixelY
        w = Picture1.Width / Screen.TwipsPerPixelX
        w = Picture1.ScaleWidth / Screen.TwipsPerPixelX
    h = Picture1.Height / Screen.TwipsPerPixelY
        h = Picture1.ScaleHeight / Screen.TwipsPerPixelY   BitBlt Picture2.hDC, 0, 0, w, h, Picture1.hDC, 0, 0, vbSrcCopy
       BitBlt Picture2.hDC, 0, 0, w, h, Picture3.hDC, 0, 0, vbMergePaint
    picture1放的是源图,picture2放的是剪切后的结果,picture3放的是Soyokaze 源码中的图片mask_mono.bmp
      

  17.   

    上面算法的代码怎么那么多,看看我给别的问题回答的帖子:
    一般按多边形抠出图像,多边形轨迹需要记住。如果你懂一些计算机图形学的知识,可以按照多边形填充算法去做,多数计算机图形学的理论书籍都有多边形填充算法,多边形填充算法已经多年不用了,还需要查书本,你自己去看吧。
    下面的例子是读一个256*256的图像,并构造一个新图像的最基本方法的代码:
    VB.NET code
    Private Sub ImageOperator(ByVal image_stream As Stream, _
                              ByVal new_image_stream As Stream)
            Dim i As Integer
            Dim j As Integer
            Dim c As Color
            Dim bit_map As Bitmap
            Dim new_bit_map As New Bitmap(new_image_stream)
            Dim _image1 As Image ' = Image.FromFile("")        _image1 = Image.FromStream(image_stream)
            bit_map = New Bitmap(_image1)
            For i = 0 To 256 - 1
                For j = 0 To 256 - 1                ' 注意下面两行代码 
                    c = bit_map.GetPixel(i, j)
                    new_bit_map.SetPixel(i, j, c)                Application.DoEvents()
                Next
            Next
        End Sub
    这实际上已经是个抠矩形的算法,如果你太懒,我帮你构造一个抠多边形的算法,但你要有耐心等。实际上在大多数游戏中的图形都是用的是多边形来造型,很少用到2次以上的曲线。