让大家久等了,今天终于能发布VB版本的迷你PhotoShop了,暂时取名为AnyView,这次发布的为1.0的网友测试版,请大家有空帮我测试下BUG。

laviewpbt 2008-10-26 07:55:24

软件(也许应该叫做小程序)历史:
2004年,大四毕业设计,题目是《基于火焰图像处理的回转窑温度场的提取》,初次接触图像处理,在半年的时间内,徘徊在图像处理的

边缘而不得正果,答辩上的事情反正就那样过去的。读研后,鉴于对本专业毫无兴趣(保送的,也就没有想换专业了),又没有女人垂青,大

好时光匆匆过了一段,觉得人生苦短,不能就此虚度。鉴于有过图像开发的历史,发现自己对这方面还是有些许感冒,就开始了图像编程的深

入。
2005年开始,导师的一个项目正好也于图像处理有关,作为曾经有过这方面经验的学生,我肯定作为导师的首选棋子。也好,有点事情做

,比大部分研究生在校荒废三年总要好。这个项目对实时性要求较强,开发语言甲方没有制定,我们自己选择了VB6.0。网络上到处都充满了对

VB图像处理的批判,自己是个不信邪的人,虽然那时候接触编程语言只有1年,不过自己相信能把这问题解决,正好那个时候看到ZYL910大侠的

VB高速图像处理系列文章。半年后,项目得以顺利完成,其中采用的方法是普通的GetDibits。
项目做完后,2006年,研二了,没有课程,没有坐什么项目了,天天坐在实验室里,很无聊,我就学了下PhotoShop,Sql

sever,AutoCad,Premior等等,不过都是泛泛的看看。基本上这个时候电脑就是我老婆了,说实在的,读研期间还没有女朋友或者说之前没有过

女朋友的人应该不多的,我们宿舍居然就有2个,想想自己硬件一般般,心里也还比较平衡。大概是下半年,偶尔翻翻ZYL910的那篇文章,对其

中的模拟指针突然非常感兴趣,于是摸索了好久也对其有了相当的了解(发现自己还不是太笨)。这时候就把以前写过的一些图像代码重新写

了下,速度上的大幅提升让我对VB的信心大增,恰巧那时在网络上看到Paint.net这个开源的C#软件,其中的滤镜及其丰富,效果也相当完美。

后来就化了相当的力气把这些代码的大部分改成VB,经过一年多的努力,于是就有了我在VBGOOD上发布的Cimage.dll。
2007年毕业后,找了一家国企的设计院工作,工作强度比较低,当然待遇也一般般,不过我很容易满足,并且在一个地方安顿下来就不想

动,说实在的对这份工作还是比较满意的,虽然我并不热爱他。好像有人说过当兴趣变为职业时,人是痛苦的吧。工作之余,还是把编程作为

自己的第二任务,第一任务哈哈是追美眉。这时,Cimage.dll基本停止了开发,因为用VB写的图像处理的DLL和VC相比即使速度不相差多少也是

没有什么优势的。恰巧在VBGOOD上Jay36发表了他用VB写的一个图像处理程序Jsee,激起了我也写个完整的程序的想法,模仿的目标是曾经学习

过的PhotoShop大牛。一开始在2007年底之前采用的是DLL和EXE分开开发,并且是单文档的,并且不涉及到图层。这个过程大概前后开发了半年

,没有一个像样的作品出来。2008年年初,在PSC上看到了几个比较优秀的图像处理代码,结合我自己的开发经验,对开发一个带图层多文档程

序有了想法,并且决定抛弃EXE和DLL分开写的方式而改为单EXE文件,期间,我建立了一个自己的QQ图像处理群,也认识了一些志同道合的朋友

。一晃又快要到年底了,多重考虑后,决定暂时放弃一些功能的编写,而先给出一个大的框架,以后在慢慢完善,于是有了这个版本的发布。



软件功能和特色:
1、支持BMP、jpg、gif、png、wmf、tiff、emf、pcx、psd、tga、ico、pbt等格式的读取,其中TIFF,ICO和GIF图像如果含有多帧,可以制

定要读取的帧数
2、支持保存为BMP、JPG、GIF、PNG、TIFF、TGA、ICO、PBT、wmf、emf等格式,其中PBT格式为自定义格式,可以保存图层的相关信息。不过

有些格式的支持不完美。
3、支持图层处理,课设置图层混合方式及透明度等等。
4、支持选区处理,选区合并方式及选区工具和PS类似。
5、支持命令行及OLE操作。
6、拥有多种滤镜特效。
7、启动速度和占用内存量较为合理。
8、文件大小不到1MB,在内部调用了GDIPLUS.DLL,如果操作系统为98以上及系统中包含了GDIPLUS.DLL,则可绿色执行。
9、除一些特殊的滤镜外,还加入了一些在分析上常用的工具,比如QQ截屏、FFT变换等。
10、和Panit.net相比执行速度有一定优势,和PS相比,调整中的滤镜速度差不多。



当然,因为时间比较仓促,这次发布程序一定存在很多Bug和错误,希望大家如果感兴趣并且有时间的话能够帮忙测试,我将在致谢名单上加入您的名字。



下载地址 :http://d.download.csdn.net/down/722477/laviewpbt


...全文
607 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzbyzq 2010-08-09
  • 打赏
  • 举报
回复
我的QQ584137595
zzbyzq 2010-08-09
  • 打赏
  • 举报
回复
你好,请与我联系,我公司需写一个类似Photoshop的软件
gaobocheng 2009-01-09
  • 打赏
  • 举报
回复
haha,good
yachong 2008-10-31
  • 打赏
  • 举报
回复
分数都给了1、2楼了
后面的兄弟一分没有 -_-!
ssihc0 2008-10-29
  • 打赏
  • 举报
回复
应该找个搞个团队,,一起帮你完善!!!
laviewpbt 2008-10-29
  • 打赏
  • 举报
回复
en
是个问题。
zjl1234567 2008-10-29
  • 打赏
  • 举报
回复
随便打开一张图,应用高斯模糊效果(效果设置成最大),在处理过程中,我想看看在该过程中程序对用户的响应性如何,就点击了,画布,结果出现异常情况,退出了。
ssihc0 2008-10-29
  • 打赏
  • 举报
回复



Private Function InsideEllipse(ByVal X As Single, ByVal Y As Single) As WHERE_IS
Dim TBase As Single
Dim THeight As Single
Dim THypotenuse As Single
If ASPECT = 1 Then
TBase = Abs(CX - X)
THeight = Abs(CY - Y)
ElseIf ASPECT > 1 Then
TBase = Abs(CX - X) * ASPECT
THeight = Abs(CY - Y)
Else
TBase = Abs(CX - X)
THeight = Abs(CY - Y) / ASPECT
End If

THypotenuse = CSng(Sqr(TBase ^ 2 + THeight ^ 2))
If THypotenuse < RADIUS - CSng(1 / PixToMM(1)) Then
InsideEllipse = Inside

ElseIf THypotenuse > RADIUS + CSng(1 / PixToMM(1)) Then
InsideEllipse = Outside

Else
InsideEllipse = OnBorder
End If

End Function

Private Sub DrawMeterGuide()
Dim X As Single
Dim Y As Single
Dim iC As Integer

Line (0, 0)-(5, 5), QBColor(7), BF
CurrentX = 0.2
CurrentY = 0.5
Print "mm"

For X = 0 To ScaleWidth Step 1
If X Mod 10 = 0 Then
Line (X + 5, 0)-(X + 5, 5)
If iC > 0 Then
CurrentX = (X + 5) - CSng(TextWidth(CStr(iC)) / Len(CStr(iC)) + IIf(Len(CStr(iC)) = 1, 0, 1))
CurrentY = 5
Print iC
End If
iC = iC + 1
Else
Line (X + 5, 0)-(X + 5, IIf(X Mod 5 = 0, 3, 1))
End If
Next X

iC = 0
For Y = 0 To ScaleHeight Step 1
If Y Mod 10 = 0 Then
Line (0, Y + 5)-(5, Y + 5)
If iC > 0 Then
CurrentX = 5
CurrentY = (Y + 5) - CSng(TextHeight(CStr(iC)) / 2)
Print iC
End If
iC = iC + 1
Else
Line (0, Y + 5)-(IIf(Y Mod 5 = 0, 3, 1), Y + 5)
End If
Next Y

End Sub



Private Function PixToMM(ByVal Pix As Single) As Single
PixToMM = Pix * 3.78
End Function

Private Sub DrawRhomb()

ReDim Preserve Pt2(0 To 4)

Pt2(0).X = PixToMM(CX)
Pt2(0).Y = PixToMM(CY) - IIf(ASPECT <= 1, PixToMM(RADIUS * ASPECT), PixToMM(RADIUS / ASPECT))
Pt2(1).X = PixToMM(CX) + IIf(ASPECT <= 1, PixToMM(RADIUS * ASPECT), PixToMM(RADIUS / ASPECT))
Pt2(1).Y = PixToMM(CY)
Pt2(2).X = PixToMM(CX)
Pt2(2).Y = PixToMM(CY) + IIf(ASPECT <= 1, PixToMM(RADIUS * ASPECT), PixToMM(RADIUS / ASPECT))
Pt2(3).X = PixToMM(CX) - IIf(ASPECT <= 1, PixToMM(RADIUS * ASPECT), PixToMM(RADIUS / ASPECT))
Pt2(3).Y = PixToMM(CY)
Pt2(4) = Pt2(0)

' Polygon hdc, Pt2(0), 5

End Sub


以前我用过这个代码,,也是网上找的,,
ssihc0 2008-10-29
  • 打赏
  • 举报
回复
兄弟,这里标尺的代码,,,你看看你用的上去不,,


Option Explicit
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long

Private Declare Function Polygon Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long
Private Pt2() As POINTAPI

Private Declare Function RoundRect Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long

Private Enum WHERE_IS
Inside = 0
Outside = 1
OnBorder = 2
OnVertex = 3
DontExist = 4
End Enum

Private CX As Single
Private CY As Single
Private RADIUS As Single
Private ASPECT As Single

Private PI As Double
Private HALPH_PI As Double

Private Function InsidePolygon(PtApi() As POINTAPI, ByVal X As Single, ByVal Y As Single) As WHERE_IS
Dim i As Integer
Dim theta As Double
Dim alfa As Double
Dim xNew As Double
Dim yNew As Double
Dim angle As Double
Dim nCount As Integer

nCount = UBound(PtApi)

If (nCount < 3) Then
InsidePolygon = DontExist
Exit Function
End If

For i = 0 To nCount
If (CLng(X) = PtApi(i).X And CLng(Y) = PtApi(i).Y) Then
InsidePolygon = OnVertex
Exit Function
End If
Next i

PtApi(nCount).X = PtApi(0).X
PtApi(nCount).Y = PtApi(0).Y

angle = 0

For i = 0 To nCount - 1
theta = ATan2(CDbl(PtApi(i).X) - X, CDbl(PtApi(i).Y) - Y)
xNew = (CDbl(PtApi(i + 1).X) - X) * Cos(theta) + (CDbl(PtApi(i + 1).Y) - Y) * Sin(theta)
yNew = (CDbl(PtApi(i + 1).Y) - Y) * Cos(theta) - (CDbl(PtApi(i + 1).X) - X) * Sin(theta)
alfa = ATan2(xNew, yNew)
If Round(alfa, 1) = Round(PI, 1) Then
InsidePolygon = OnBorder
Exit Function
End If
angle = angle + alfa
Next i

If (Abs(angle) < 0.0001) Then
InsidePolygon = Outside
Exit Function
ElseIf (Abs(angle) > PI) Then
InsidePolygon = Inside
Exit Function
End If

End Function

Private Function ATan2(ByVal X As Double, ByVal Y As Double) As Single

If X = 0 Then
If Y > 0 Then
ATan2 = HALPH_PI
ElseIf Y < 0 Then
ATan2 = -HALPH_PI
Else
ATan2 = 0
End If
ElseIf Y = 0 Then
If X < 0 Then
ATan2 = PI
Else
ATan2 = 0
End If
Else
If X < 0 Then
If Y > 0 Then
ATan2 = Atn(Y / X) + PI
Else
ATan2 = Atn(Y / X) - PI
End If
Else
ATan2 = Atn(Y / X)
End If
End If

End Function

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF8 And Shift = 0 Then
While ShowCursor(False) >= 0
Wend
ElseIf KeyCode = vbKeyF9 And Shift = 0 Then
While ShowCursor(True) < 0
Wend
End If
End Sub

Private Sub Form_Load()
Dim Pt As POINTAPI

PI = 4 * Atn(1)
HALPH_PI = PI / 2

Show
DoEvents

Pt.X = PixToMM(CX)
Pt.Y = PixToMM(CY)
ClientToScreen hwnd, Pt

SetCursorPos Pt.X, Pt.Y

End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim WI As WHERE_IS
Dim sPos As String
Dim sCaption As String

AutoRedraw = False
DrawWidth = 1
Refresh
DrawStyle = vbDot

If X >= 5 And Y >= 5 Then
Line (X, 0)-(X, ScaleHeight)
Line (0, Y)-(ScaleWidth, Y)
sPos = "X:" + Str(Round(X - 5, 2)) + ", Y:" + Str(Round(Y - 5, 2))
CurrentX = ScaleWidth - (TextWidth(sPos) + 1)
CurrentY = ScaleHeight - (TextHeight(sPos) + 1)
Print sPos
End If

WI = InsideEllipse(X, Y)
If WI = Inside Then
If sCaption <> "InSide Ellipse" Then
sCaption = "InSide Ellipse"
End If
ElseIf WI = Outside Then
If sCaption <> "OutSide Ellipse" Then
sCaption = "OutSide Ellipse"
End If
Else
If sCaption <> "OnBorder Ellipse" Then
sCaption = "OnBorder Ellipse"
End If
End If

WI = InsidePolygon(Pt2(), PixToMM(X), PixToMM(Y))
If WI = Inside Then
If sCaption <> sCaption + " and InSide Polygon" Then
sCaption = sCaption + " and InSide Polygon"
End If
ElseIf WI = Outside Then
If sCaption <> sCaption + " and OutSide Polygon" Then
sCaption = sCaption + " and OutSide Polygon"
End If
ElseIf WI = OnBorder Then
If sCaption <> sCaption + " and OnBorder Polygon" Then
sCaption = sCaption + " and OnBorder Polygon"
End If
ElseIf WI = OnVertex Then
If sCaption <> sCaption + " and OnVertex Polygon" Then
sCaption = sCaption + " and OnVertex Polygon"
End If
Else
If sCaption <> sCaption + " and Polygon Don't Exist" Then
sCaption = sCaption + " and Polygon Don't Exist"
End If
End If

If Me.Caption <> sCaption Then
Me.Caption = sCaption
End If

End Sub


Private Sub Form_Resize()
On Error Resume Next
If Me.WindowState <> vbMinimized Then
CX = (ScaleWidth / 2) + 3
CY = (ScaleHeight / 2) + 3
RADIUS = (ScaleHeight / 3)
ASPECT = 1.2
DrawStyle = vbSolid
AutoRedraw = True
Cls
DrawWidth = 1
DrawMeterGuide
DrawWidth = PixToMM(1)

DrawRhomb
ForeColor = QBColor(2)
ForeColor = QBColor(0)
Refresh
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
ShowCursor True
Cls
Erase Pt2
End
Set Form1 = Nothing
End Sub


ttsffgg 2008-10-28
  • 打赏
  • 举报
回复
强大啊~~~~
东方之珠 2008-10-28
  • 打赏
  • 举报
回复
我看了一下,这个软件不小,应该有2至3M,只不过用UPX压缩了一下,速度还不错。
zhao_yong 2008-10-28
  • 打赏
  • 举报
回复
AnyView名字還可以,幫你測試一下.
laviewpbt 2008-10-28
  • 打赏
  • 举报
回复
为什么我找不到我的帖子到那里去了啊?
无·法 2008-10-27
  • 打赏
  • 举报
回复
good!先看看
hecaiyun2003 2008-10-27
  • 打赏
  • 举报
回复
LZ,我下载解压缩后,双击,报错.
Run-time error '53':
File not found: gdiplus
laviewpbt 2008-10-27
  • 打赏
  • 举报
回复
与系统无关
没有加入判断语句,也就是说没有写提示的代码。Thanks again.
  • 打赏
  • 举报
回复


啊。啊。昨天想继续发。CSDN说偶灌水。。。偶汗

昨天还发现一个问题。就是不管是新建文件是打开文件进行修改操作以后再关闭程序好像都没有提示保存

上面有个兄弟提到了保存对话框。但是我这没有

偶用的系统是WIN2003 SERVER SP1 不知道跟系统有没有关系

现在还是人类 2008-10-27
  • 打赏
  • 举报
回复
其实PS的优点不是滤镜,而是工具和快捷键,这方面能做好就有点实用价值了。
yachong 2008-10-27
  • 打赏
  • 举报
回复
使用放大镜工具的时候,最好加上图标,
然后按住shift之类的按键可以切换放大/缩小模式
东方之珠 2008-10-27
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 Jay36 的回复:]
我的更接近光影魔术手(别扔臭鸡蛋,虽然相比差很多)
楼主的更接近PS。

但是我的界面还是参考PS很多的 比如右侧工具栏就是取自PS CS3
[/Quote]

我看了,你的右侧工具拦做得很不错!另外,还有不少滤镜!
加载更多回复(41)

809

社区成员

发帖
与我相关
我的任务
社区描述
VB 多媒体
社区管理员
  • 多媒体
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧