visualbasic.net:Visual Basic.NET和GDI+共创图标编辑器

  如果想自己设计个个性独特ico图片然后让它成为如"我电脑""回收站"这样图标该如何做?就只有用些专门画图工具windows画图无法创建ico文件于是本人利用.net和GDI+就编写了个这样画图工具虽然现在有很多文章都介绍了GDI+技术但都只是纯粹GDI+简单应用介绍至少我还没有看见篇利用GDI+开发个完整软件Software或片段文章

  这个实现了以下功能:将BMP、JPG、jpeg、GIF、.png、.tf文件转化成ico文件可以对转化后文件进行编辑;创建并编辑个新ico文件;对已有ico文件进行编辑所有被编辑文件都保存为ico文件可以在任何可使用ico文件地方使用它们

  我先介绍说明下什么是GDI+GDI+ 是GDI(Windows 早期版本提供图形设备接口)后续版本是Microsoft Windows XP操作系统即后续版本图形显示技术它已经集成到了.net开发环境中所以不管你OS是什么版本只要安装了.NET框架就有了GDI+(注意:是.net框架而不是.net开发环境所以win98中也可以使用GDI+)当然它也提供了传统api可以由.net或非.net开发工具由于他和GDI使用有很大差别所以要使用GDI+就必须从头学GDI+要比GDI简单得多

  现在就来看下如何实现这个软件Software:先添加picturebox0penfiledialog,savefiledialog,colordialog,doupdown,labelControl控件;然后添加两个菜单即它们子菜单添加菜单如下"文件"菜单包括"新建""打开""保存""退出""功能"菜单包括"直线""选择颜色"代码如下在代码后给出介绍说明:

  Public Class Form1
Inherits .Windows.Forms.Form
Public imagepen, bit, changiamge, mpen 'movepen,moveb,,grh,filenames,endpen
Dim xd, yd, xu, yu, pk, ps
Private Sub MenuItem9_Click(ByVal sender As .Object,
ByVal e As .EventArgs) 'Handles MenuItem9.Click
'新建个ico文件即"新建"菜单
 PictureBox1.Image = Nothing
 Dim bit As New .Drawing.Bitmap(32, 32,
 Drawing.Imaging.PixelFormat.Format32bppArgb)'建立个Bitmap对象以便在它上面画图
 Dim x, y
 For x = 0 To 31
  For y = 0 To 31
   bit.SetPixel(x, y, Color.Transparent)'将Bitmap背景设置为透明
  Next
 Next
 bit = bit
 MenuItem3.Enabled = False'"选择颜色"菜单不可用
 MenuItem2.Enabled = True'"直线"菜单可用
End Sub
Private Sub MenuItem6_Click(ByVal sender As .Object,
ByVal e As .EventArgs)' Handles MenuItem6.Click
'打开图片文件即"打开"菜单"
 OpenFileDialog1.Filter = "ico文件(*.ico)|*.ico|图像文件
(*.BMP;*.JPG;*.jpeg;*.GIF;*.png;*.tf)|*.BMP;*.JPG;*.jpeg;*.GIF;*.png;*.tf"
 OpenFileDialog1.FilterIndex = 2
 OpenFileDialog1.ShowDialog
 OpenFileDialog1.FileName = ""
End Sub
Private Sub MenuItem8_Click(ByVal sender As .Object,
ByVal e As .EventArgs) 'Handles MenuItem8.Click
 Me.Close'退出
End Sub
Private Sub MenuItem7_Click(ByVal sender As .Object,
ByVal e As .EventArgs)
 'Handles MenuItem7.Click
 '保存文件即"保存"对话筐
 PictureBox1.Cursor = .Windows.Forms.Cursors.Default
 SaveFileDialog1.Filter = "ico文件(*.ico)|*.ico"'设置要保存文件后缀
 SaveFileDialog1.ShowDialog
 If SaveFileDialog1.FileName <> "" Then
  If Not SaveFileDialog1.ShowDialog.Cancel Then
   Dim bmp As New .Drawing.Bitmap(PictureBox1.Image,
32,32)'从PictureBox1.Image化Bitmap设置保存为图片大小标准ico图由
32*32和16*16两种格式组成此处为32*32你也可以设置为16*16
   Dim ico As .Drawing.Icon = ico.FromHandle(bmp.GetHicon)
   '用Bitmap句柄化icon他是专门处理ico文件
   Dim file As New .IO.FileStream(SaveFileDialog1.FileName,
   IO.FileMode.Create)'创建文件流
   ico.Save(file)'保存为ico文件
   file.Close'关闭流
  End If
 End If
End Sub
Public Sub MenuItem2_Click(ByVal sender As .Object,
ByVal e As .EventArgs)
 'Handles MenuItem2.Click
 '是用直线在新建ico中画图
 PictureBox1.Cursor =.Windows.Forms.Cursors.Cross
 '在PictureBox1中鼠标样式
 ColorDialog1.ShowDialog
 Dim pen As New Pen(ColorDialog1.Color, DoUpDown1.Text)'创建画笔
 imagepen = pen
End Sub
Private Sub PictureBox1_MouseDown(ByVal sender As .Object,
ByVal e As .Windows.Forms.MouseEventArgs)
 'Handles PictureBox1.MouseDown
 '当按下鼠标左键时获取直线起点
 If e.Button = MouseButtons.Left Then
  xd = e.X / 8 : yd = e.Y / 8
 End If
End Sub
Private Sub PictureBox1_MouseUp(ByVal sender As .Object,
ByVal e As .Windows.Forms.MouseEventArgs)
 'Handles PictureBox1.MouseUp
 '画出直线
 If PictureBox1.Cursor Is .Windows.Forms.Cursors.Cross And ps <> 1 Then
  xu = e.X : yu = e.Y
  Me.k(1, imagepen, yu / 8, xu / 8, xd, yd)
 Else
  If OpenFileDialog1.FilterIndex = 1 Then
   xu = e.X : yu = e.Y
   Me.k(2, mpen, yu / 8, xu / 8, xd, yd)
  End If
 End If
End Sub
Public Sub k(ByVal k As Integer, ByVal drawtool As Object,
ByVal x As Integer, ByVal y As Integer, ByVal xs As Integer,
ByVal ys As Integer)
 If k = 1 Then
  PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage'自动容纳图片
  PictureBox1.Image = bit
  Dim Graphic As Graphics
  Graphic = Graphic.FromImage(Me.PictureBox1.Image)'在PictureBox1上画图
  Graphic.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias'锯齿削边
  Graphic.DrawLine(drawtool, y, x, xs, ys)'画线
 End If
  If k = 2 Then
   PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
   PictureBox1.Image = changiamge
   Dim Graphic As Graphics
   Graphic = Graphic.FromImage(Me.PictureBox1.Image)
   Graphic.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias
   Graphic.DrawLine(drawtool, y, x, xs, ys)
  End If
End Sub
Private Sub MenuItem3_Click(ByVal sender As .Object,
ByVal e As .EventArgs)
 'Handles MenuItem3.Click
 '对打开ico文件用直线画图
 ColorDialog1.ShowDialog
 Dim m3pen As New Pen(ColorDialog1.Color, DoUpDown1.Text)'建立画笔
 mpen = m3pen
End Sub
Private Sub OpenFileDialog1_FileOk(ByVal sender As Object, ByVal e As
.ComponentModel.CancelEventArgs)
 'Handles OpenFileDialog1.FileOk
 '打开文件
 If OpenFileDialog1.FilterIndex = 1 Then
  Dim m3pen As New Pen(Color.Black, DoUpDown1.Text)
  mpen = m3pen
  MenuItem2.Enabled = False
  MenuItem3.Enabled = True
 Else
  MenuItem3.Enabled = False
  MenuItem2.Enabled = False
 End If
 If OpenFileDialog1.FileName <> "" Then
  PictureBox1.Cursor = .Windows.Forms.Cursors.Default
  Dim images As New .Drawing.Bitmap(OpenFileDialog1.FileName)
  changiamge = images
  PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
  PictureBox1.Image = images
  Me.Text = OpenFileDialog1.FileName
 End If
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As .EventArgs)
  'Handles MyBase.Load
  '由于刚运行次没有打开ico文件和新建立ico对象所以不可以创建画图工具对象
  MenuItem3.Enabled = False
  MenuItem2.Enabled = False
End Sub
End Class


  介绍说明:

  1. 如何新建ico文件:先化bitmap然后在"功能"-"直线"菜单代码中创建画笔就可以开始画了此时只是创建个bitmap对象是我们在picturebox中画画完后将bitmap对象保存到文件就完成了新建ico文件

  2.如何打开已有ico文件并修改后保存它:判断打开文件是否是ico如果不是就只显示他如果是就显示并且个画笔通过"功能"-"选择颜色"来改变画出直线颜色和宽度然后保存就完成了对原来ico文件修改

  3.保存文件和对非ico文件转化为ico文件:通过打开文件将非ico文件显示在picturebox中在用picturebox.image化bitmap对象此句实际作用是将当前picturebox.image内容附给bitmap用bitmap句柄icon对象(处理ico文件对象)作用是将非ico文件转化为ico文件建立文件流对象在其中指定新文件名和访问思路方法(文件流是save思路方法参数)使用icon对象save保存最后关闭文件流

  4.如何画:当完成1或2后就可以开始画图画图是由sub k过程mouse-downmouse-up来实现此时mouse-down获得直线起点在mouse-up中获得直线终点接着在mouse-up 中sub k过中程绑定bitmap对象到pictureboximage属性作用类似于有了张可以画画并在sub k中用Graphic.FromImage(Me.PictureBox1.Image)语句创建Graphics对象表示是在PictureBox1.Imagebitmap对象中画而不是在PictureBox1上画他们区别在于前者是可以保存画画结果后者不可以K值表示是在新建ico文件中画还是修改以有ico文件(k=2是表示修改已有ico文件)

  5.些语句介绍说明:dim pen …是指用钢笔来画object.rawline(….)表示画直线

  6.文件格式转换问题:你可以使用image对象save思路方法来转换图象格式但是我发现虽然他提供了icon格式但转化后不是ico文件而是png文件从网上资料显示这是.net本身问题顺便提下image对象无构造他虽然标为必须继承才可使用但实际上不行如要使用它要用他fromfile或fromstream思路方法来构造它

  7.有关k问题:当你看懂这篇文章后你定会提出为什么在每条分支中PictureBox1.SizeMode = PictureBoxSizeMode.StretchImagePictureBox1.Image = changiamge这两句代码不可以和它后面代码分开放在其他地方如k=1时放在"新建"菜单中代码部分k=2是放在mouseup中语句中!其实这两句就是我在编写这个时遇到最大难题我用了两个小时才出这两句代码要放在了现在位置最后看资料并和朋友探讨后得出3个结论:

  1. .NET本身问题

  2.如果分开使PictureBox1.Image对象丢失(PictureBox1.Image返回是bitmap对象)无法绑定到Graphics

  3. PictureBox1.Image对象在sub k中不可见虽然我不知道那个结论是对但我将它写了出来仅供参考

  对于0penfiledialog,savefiledialog,colordialogdoupdown文件流使用请见msdn这5个只是为了辅助这个而使用如果要在这里讲清楚那这片文章就太长了而且这些使用很简单我在中使用画图工具是钢笔画出图形是直线这队ico文件已经够有了如果你想使用其他工具画其他图形只要修改"功能"中子菜单和sub k代码就够了

  运行如图:



Tags:  公式编辑器 图片编辑器 vsualbasic.net visualbasic.net

延伸阅读

最新评论

发表评论