如何用VB把一张图片裁剪成扇形呢?
我这里有段代码,是用正方形或者长方型进行裁剪的.怎么修改一下,才可以用扇型裁剪一幅图片呢?最好是源码,因为我是做JAVA的,对VB不懂,还请赐教!
非常的感谢!
早上问过了,没有人理我,是不是分数不够? 如果问题解决了,再追加100分.
http://topic.csdn.net/u/20081023/11/c5b0048a-27a3-46c3-864d-db33cdbfdaed.html
我这里有段代码,是用正方形或者长方型进行裁剪的.怎么修改一下,才可以用扇型裁剪一幅图片呢?最好是源码,因为我是做JAVA的,对VB不懂,还请赐教!
非常的感谢!
早上问过了,没有人理我,是不是分数不够? 如果问题解决了,再追加100分.
http://topic.csdn.net/u/20081023/11/c5b0048a-27a3-46c3-864d-db33cdbfdaed.html
解决方案 »
- 有关[安全证书]的问题!救助!
- VB怎样来实现为指定的ACCESS表增加字段及该字段的数据类型?
- 我用POST的方式提交数据,出现一个怪的现象,请大家帮忙看看!
- 怎样知道软驱或者光驱里没有磁盘??
- 网上下的单个空间,没有说明的,怎么使用?有没有通用的方法???
- Hscroller控件的使用方法,很简单可我就是查不到资料!!拿分吧!!
- 急!在线等,如何在客户端通过Http访问SQL数据库的问题?
- 请教,如何用VB与大网站的搜索引擎相连接?用ASP?FTP?
- 系统高手请进(有关WIN2K)
- 寻求帮助
- 如何用setupfactory 捆绑打包其他得setup.exe呢?
- 请问怎么用VB修改电脑IP地址
标准的剪裁区都是矩形的,用纯API就可做到。非标准的恐怕有要到数学知识,比如:圆的方程,三角函数。在一个半圆内可以画分出若干小矩形来。只是一些猜想,没做过。
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
图片贴不上来?!未裁剪之前的图片:
http://album.hi.csdn.net/views/photo/235127用扇型裁剪之后的效果图:
http://album.hi.csdn.net/views/photo/235128用扇型裁剪图片时的扇型:
http://album.hi.csdn.net/views/myalbums
http://album.hi.csdn.net/views/photo/235127 用扇型裁剪之后的效果图:
http://album.hi.csdn.net/views/photo/235128 用扇型裁剪图片时的扇型:
http://album.hi.csdn.net/views/myalbums
http://album.hi.csdn.net/views/myalbums
目前的背景颜色只能设定成某种颜色,正在实现保存为背景为透明色的32位位图。(其实代码里已有这个功能,具体实现还要加一些代码,挺麻烦,明天吧,弄完了再上传)
非常感谢呀.
裁剪之后的效果图就是这个样子的.
"目前的背景颜色只能设定成某种颜色,正在实现保存为背景为透明色的32位位图",你的意思是在保存的时候,扇形图以外的背景色设置为透明的吗? 这样也比较好,打印的时候,只打印有颜色的扇型部位.
有个问题,这个扇型截图的时候,是固定在一幅图片的某个位置(比如:中间)截图的呢还是灵活的可以随意的选择图片的某个位置截图的?
我先看看代码啊.
请问"Mofile"在什么地方?
你的提取码好象有问题.
http://pickup.mofile.com/9364855036798474
你访问的共享文件提取码 9364855036798474 不正确,可能的原因是:
1. 此共享文件的提取码已过期
2. 提供给您此共享文件的朋友取消了共享或者删除了此文件
3. 输入的提取码(16位数字)不正确。
好了就说一声,我毕恭毕敬的等着的.
以经加入了保存为32位位图的功能。(Windows自带的浏览器看不出透明效果,需要XnView等看图软件或自己转换为png格式才可以看到)
另外这个只是个演示版,仅仅提供了思路。
哈哈,平常很少编程,但是我可以做出来,没想到不知不觉达到了专家水平了。
可以通过数学模型做任何形状的的mask,然后与原来的图片做位相应的位运算,可以剪裁任何形状。
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
一般按多边形抠出图像,多边形轨迹需要记住。如果你懂一些计算机图形学的知识,可以按照多边形填充算法去做,多数计算机图形学的理论书籍都有多边形填充算法,多边形填充算法已经多年不用了,还需要查书本,你自己去看吧。
下面的例子是读一个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次以上的曲线。