GDIP-BITMAP-EFFECT 小白福利 不会高斯模糊等效果的算法 怎么办
vb吧
全部回复
仅看楼主
level 13
Lyh🌐oki 楼主
某些算法 如模糊 锐化 等等 算法并不像我们想象的那么简单
你想象的模糊是:求周围点的平均值
但其实是:要用高斯的什么乱七八糟的公式去算
然而我看不懂[不高兴]
怎么办?现在就用智能王 双卡待机 [滑稽]
啊呸 那个啥 可以用gdip自带的函数来实现啊[滑稽]
2015年10月02日 11点10分 1
level 13
Lyh🌐oki 楼主
自占二楼
2015年10月02日 11点10分 2
后面的xp不能用纯属舆论 xp更新到gdip1.1 即可使用[吐舌]
2015年10月06日 03点10分
2015年10月25日 03点10分
回复 杰克冻人之怒 :你说如果电脑系统是winxp,这个代码就不能用?
2016年02月25日 10点02分
@studentxuefei 我不是更正了吗[汗]
2016年02月25日 12点02分
level 13
Lyh🌐oki 楼主
你们先围观着 我一会儿回来
2015年10月02日 11点10分 3
UP
2015年10月02日 23点10分
UP
2015年10月03日 00点10分
UP
2015年10月03日 01点10分
UP
2015年10月03日 11点10分
level 13
Lyh🌐oki 楼主
马蛋 没人[喷] 对了顺便说一句 xp党可以走了。。这个东西在vista及以上版本的系统中+gdip1.1才可以使用
2015年10月02日 11点10分 4
ps xp可以用 只不过不是自带gdip1.1而已
2015年10月02日 23点10分
level 10
少说废话啊
2015年10月02日 11点10分 5
我写教程居然还有人说我废话[喷]
2015年10月02日 11点10分
回复
杰克冻人之怒
:我说的是2楼
2015年10月02日 11点10分
@hhxxhg 2L是我用来留最终的程序以及更新的地址用的。。
2015年10月02日 11点10分
回复
杰克冻人之怒
:那3楼是干嘛的……
2015年10月02日 11点10分
level 13
Lyh🌐oki 楼主
首先 你要有vistawx大神的模块 没有的看这里
[无效] http://pan.baidu.com/s/1dDk7Mxj
在项目中添加这个模块
2015年10月02日 11点10分 6
level 13
Lyh🌐oki 楼主
然后是往常的初始化、加载、销毁gdip
Dim graphics As Long, bitmap As Long
Dim w As Long, h As Long
Private Sub Form_Load()
InitGDIPlus
GdipCreateFromHDC Me.hDC, graphics
End Sub
Private Sub Form_Unload(Cancel As Integer)
GdipDeleteGraphics graphics
TerminateGDIPlus
End Sub
2015年10月02日 11点10分 9
level 13
Lyh🌐oki 楼主
本教程用的是这张图 将其重命名为1.jpg放在工程目录下
2015年10月02日 11点10分 11
level 13
Lyh🌐oki 楼主
其实有基础的人可以直接从这里开始看[滑稽]
2015年10月02日 11点10分 13
level 13
Lyh🌐oki 楼主
之前我翻了翻vistawx大神的模块
里面有这个api GdipCreateEffect
这是我们要用的api
然后 你要是仔细找的话会在前面看到
#If GdipVersion >= 1.1 Then
后面也有
#End If
我还发现了这个函数
GdipCreateEffect2
但是前面写着
#If GdipVersion >= 1.1 Then
后面另一个函数
这个函数后面写着
#End If
是这样的
它是条件编译,只有条件满足时 其中的代码才会被编译
然后我去找了一下GdipVersion的定义
结果发现

#Const GdipVersion = 1#

vistawx!!!wqnmlgb[喷]
这样的话GdipCreateEffect2这个函数以及GdipCreateEffect这个API永远也不会被编译
然后我机智地将1#改成了1.1[滑稽]
不过这个改法会付出代价
但是如果你的系统版本>=Vista就没问题
2015年10月02日 12点10分 15
xp的gdip版本更新成1.1也没问题
2015年10月02日 23点10分
level 13
Lyh🌐oki 楼主
如果是xp党的话后面的代码会报错
但是我记得我说过让xp党走了[滑稽]
2015年10月02日 12点10分 16
xp党电脑上装了gdip1.1就没问题
2015年10月02日 23点10分
回复
杰克冻人之怒
:可以把1.1的gdiplus.dll放在exe路径下,然后在manifest里配置只加载相对路径下的gdiplus.dll。
2015年10月03日 04点10分
@yjryym [真棒]谢大神指点
2015年10月03日 04点10分
level 13
Lyh🌐oki 楼主
现在可以用这个api了
它的定义
Public Declare Function GdipCreateEffect _
Lib "gdiplus" (ByVal Guid41 As Long, _
ByVal Guid42 As Long, _
ByVal Guid43 As Long, _
ByVal Guid44 As Long, _
effect As Long) As GpStatus
这些都什么鬼?![喷]
其实这个还可以解释一下。。
但是vistawx已经封装好了
后面的函数GdipCreateEffect2是他的封装结果
Public Sub GdipCreateEffect2(ByVal EffectType As GdipEffectType, effect As Long)
首先你需要声明一个变量储存effect的地址
然后你就调用这个函数就Ok了[笑眼]
是不是小白福利啊[滑稽]
2015年10月02日 12点10分 17
level 13
Lyh🌐oki 楼主
现在你的代码是这样
Option Explicit
Dim graphics As Long, bitmap As Long, effect As Long
Dim w As Long, h As Long
Private Sub Command1_Click()
GdipCreateBitmapFromFile StrPtr(App.Path & "\1.jpg"), bitmap
GdipGetImageWidth bitmap, w
GdipGetImageHeight bitmap, h
GdipDrawImageRect graphics, bitmap, 0, 0, Me.ScaleWidth, Me.ScaleHeight
Me.Refresh
End Sub
Private Sub Form_Load()
InitGDIPlus
GdipCreateFromHDC Me.hDC, graphics
GdipCreateEffect2 GdipEffectType.Blur, effect
End Sub
Private Sub Form_Unload(Cancel As Integer)
GdipDeleteEffect effect
GdipDisposeImage bitmap
GdipDeleteGraphics graphics
TerminateGDIPlus
End Sub
2015年10月02日 12点10分 20
level 13
Lyh🌐oki 楼主
现在就是如何使用了
看这个
Public Declare Function GdipBitmapApplyEffect _
Lib "gdiplus" (ByVal bitmap As Long, _
ByVal effect As Long, _
roi As RECTL, _
ByVal useAuxData As Long, _
auxData As Any, _
auxDataSize As Long) As GpStatus
第一个参数是bitmap的地址,第二个参数是effect的地址,第三个参数是应用效果的范围 是一个Rect
后几个参数
http://www.cnblogs.com/Imageshop/archive/2012/12/13/2815712.html
这个大神说是返回给用户的数据,说不用管它
那么就都传入0好了
2015年10月02日 12点10分 21
level 13
Lyh🌐oki 楼主
不能调模糊度吗? 不能用其他效果吗?[疑问]
一连串的问题来了
今天因为时间原因我先解决第一个问题[滑稽]
2015年10月02日 12点10分 24
level 13
Lyh🌐oki 楼主
先看这个api
Public Declare Function GdipSetEffectParameters _
Lib "gdiplus" (ByVal effect As Long, _
Params As Any, _
ByVal size As Long) As GpStatus
传入effect的地址,“参数”(设置effect用的),以及“参数”的大小
因为效果可变 所以参数的类型也可以变(不难解释 因为不同的效果有不同的参数)
但参数全部统一为结构体
这个效果的结构体是由一个浮点数(模糊度),一个布尔值(拓展边界)
那么结构体的声明是这样的
Private Type BlurParameters
Radius As Single
ExpandEdges As Boolean
End Type
2015年10月02日 12点10分 25
注意了!这里我之前写错了 ExpandEdges的类型是Long 值是0或1!!! 还有 vistawx的模块里面有 BlurParams这个结构体!
2015年10月03日 01点10分
level 13
Lyh🌐oki 楼主
前面的api的最后一个参数是结构体的大小
调用lenb就可以了
在窗体上拖一个HScrol,Min值为0,Max值为255,设置模糊度用
因为这里的大神(http://www.cnblogs.com/Imageshop/archive/2012/12/13/2815712.html)说模糊度的最小值是0,最大值是255
现在要设置效果 就在应用效果那句代码(ApplyEffect)前面加:
Dim p As BlurParameters
p.Radius = HScroll1.value
p.ExpandEdges = False
GdipSetEffectParameters effect, p, LenB(p)
2015年10月02日 12点10分 26
注意了!这里我之前写错了 ExpandEdges的类型是Long 值是0或1!!! 还有 vistawx的模块里面有 BlurParams这个结构体!
2015年10月03日 01点10分
level 13
Lyh🌐oki 楼主
现在你的代码应该是这样(注意模块里的GDI+版本要改)
Option Explicit
Dim graphics As Long, bitmap As Long, effect As Long
Dim w As Long, h As Long
Private Type BlurParameters
Radius As Single
ExpandEdges As Boolean
End Type
Private Sub Command1_Click()
GdipCreateBitmapFromFile StrPtr(App.Path & "\1.jpg"), bitmap
GdipGetImageWidth bitmap, w
GdipGetImageHeight bitmap, h
Dim p As BlurParameters
p.Radius = HScroll1.value
p.ExpandEdges = False
GdipSetEffectParameters effect, p, LenB(p)
GdipBitmapApplyEffect bitmap, effect, NewRectL(0, 0, w, h), 0, 0, 0
GdipDrawImageRect graphics, bitmap, 0, 0, Me.ScaleWidth, Me.ScaleHeight
Me.Refresh
End Sub
Private Sub Form_Load()
InitGDIPlus
GdipCreateFromHDC Me.hDC, graphics
GdipCreateEffect2 GdipEffectType.Blur, effect
End Sub
Private Sub Form_Unload(Cancel As Integer)
GdipDeleteEffect effect
GdipDisposeImage bitmap
GdipDeleteGraphics graphics
TerminateGDIPlus
End Sub
2015年10月02日 12点10分 27
注意了!这里我之前写错了 ExpandEdges的类型是Long 值是0或1!!! 还有 vistawx的模块里面有 BlurParams这个结构体!
2015年10月03日 01点10分
level 13
Lyh🌐oki 楼主
呦西 由于时间原因今天先写这么多
快来人啊!!!!
@刘大王111 [滑稽]
2015年10月02日 12点10分 29
其实.net也可以用 但是没有封装进来 所以显得有些麻烦
2015年10月02日 23点10分
回复
杰克冻人之怒
:“麻烦”是相对于封装好的GDI+ 整体还是比vb6方便很多的
2015年10月03日 01点10分
level 13

2015年10月02日 13点10分 30
谢顶[哈哈]
2015年10月02日 14点10分
1 2 3 4 尾页