zoukankan      html  css  js  c++  java
  • vb.net 图像处理相关

    1) '分解RGB颜色值 
    R = (Color Mod 256) '红色
    b = (Int(Color \ 65536)) '蓝色
    G = ((Color - (b * 65536) - R) \ 256) '绿色
    Text1.BackColor = RGB(R, G, b)

    2
    Dim memoryImage As Bitmap
    Dim myGraphics As Graphics = Me.CreateGraphics()
    Dim s As Size = New Size(sw, sh)
    memoryImage = New Bitmap(1280,800, myGraphics)
    Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage)
    memoryGraphics.CopyFromScreen(0, 0, 0, 0, s)
    )

    3)PictureBox1.Image.RotateFlip(RotateFlipType.Rotate90FlipX)
    PictureBox1.Refresh()

    4)vb.net dll
    关于用户控件的使用,.net与v6环境下是有那么小小的区别。v6环境下的用户控件编写后可以直接使用,而在.net环境下,则需要先生成控件库(dll,应用程序扩展格式),然后再将这个控件库导入到.net编程环境的工具箱上方可使用。    其具体方法如下(以VS 2010,Visual Basic.net 为例):  1、新建项目->Visual Basic->Windows->Windows 窗体控件库->键入控件库名称(默认为Usercontrol1)确定;  2、设计你的用户控件,完成后按“F7”进行编译;  3、在该解决方案目录下找到控件库扩展(默认为UserControl1.dll),确认项目已经生成。    在上三项为控件库DLL的生成方式,下面是调用方式:  4、新建项目->Visual Basic->Windows->Windows 窗体应用程序->确定;  5、打开工具箱,以任意一个控件上点击右键->选择项->.net framework组件->浏览->定位到生成的控件库扩展->确定;  6、在工具箱中找到新添加的用户控件,将其拖至窗体中进行设计。    经测,在.net环境下编译的用户控件是通用的。也就是说使用Visual Basic.net编写的用户控件,也可以在C#工程里使用,反之亦然。这充分体现了.net语言的交互性,在我看来,.net下各种语言能力相当,它们都是作为一种中间语言,编译出中间代码。所以,在.net环境下,采用混合编程也未尝不是一样提高效率的一种可选的方式。
     
    5)
    以下是我以前摸爬滚打时积累下来的一些经验, 应该比网上大多数VB教材要好, 因为精简实用. 
    虽然都是自己弄出来的, 但是还是要谢谢Ms. Debbie Gann帮助我入门.

    基础绘图

    拖个按钮到Form1上.
    双击按钮, 在里面输入

            Dim gg As Graphics
            gg = Graphics.FromHwnd(Me.Handle)
            gg.DrawRectangle(Pens.AliceBlue, 0, 0, 100, 100)

    结束后Debug, 按下按钮就会画一个方形

    Dim gg as Graphics 是在定义一个图像处理器,名叫gg

    gg = Graphics.FromHwnd(Me.Handle) 是在指定画在什么地方

    这前两句是初始化用

    常用的有:
    用FromHwnd来画在组件上...Me.Handle代表是直接画在Form1上, 也就是本Class
    用FromImage来画在组件的图片属性上, 如FromImage(Me.Backgroundimage)
    注意如果这样做, 本来的Backgroundimage里必须有东西,不能是null..否则会有错.

    gg.drawRectangle(画笔颜色, x, y, 宽,高)
    另gg.下还会出现很多别的东西,如DrawElipse来画椭圆, 用DrawImage来画程序外的图片..
    DrawImageUnscaled意味着会以原始大小来画图, 速度更快..

    要画程序外的图片可以直接画的时候加载:

    gg.drawimage(Image.FromFile("路径"), 画图位置)

    如: gg.drawimage(image.fromfile("c:\aaa.bmp"), 0,0)
    在gg所定义上的组件的0,0的位置画上aaa.bmp

    也可以先加载:

    dim bp as bitmap
    bp = image.fromfile("c:\aaa.bmp")
    gg.drawimage(bp, 0,0)

    gg.drawimage(图片, x,y, 宽,高) 可以控制图片的大小,如不填宽高则按照原来尺寸画出
    gg.drawimageunscaled则不能控制大小


    另有FillRectangle和一些其他Fill开头的可以画实心的图形.

    可以把一个bitmap弄得透明:

    dim bp as bitmap
    bp.MakeTransparent()

    如果不在MakeTransparent中放任何值, 系统将会选择图像左上角的像素颜色作为透明色,否则将会使用我们在MakeTransparent里送入的颜色值。

    动画概念

    在VB.NET中让一个画面成为动态, 无非包括这样一个过程: 绘制 - 擦除- 绘制
    所谓擦除有两个方法, 一是用别的图覆盖, 二是在intptr画的图(以gg.fromhwnd(****)初始化的绘制工具) 只要用refresh()的命令就能清除.
    为了速度与流畅, 最好用覆盖的方法
    如果只是为了程序简单,则用refresh()

    Double Buffer 与 BitBlt
    这两个不需要用到,当时我在网上学的很模糊,也可能有错.根据模糊的记忆..
    BitBlt是在屏幕上看不见的地方画上一些常用图, 然后在需要用这些图的时候直接从屏幕的一个地方抄到另一个地方,这样比直接绘制的速度要快很多.
    Double Buffer是把即将显示的帧画好, 然后显示的时候开始画后面的帧...

    帧:Frame, 动画的一页

    在VB.NET中, 似乎BitBlt已经是自动化的了, 而一个Form上通常会有Double Buffer [True/False]的属性供选择...我试了下, 看不出效果...

    像素处理

    像素的处理主要有三个部分:得到特定点的像素信息,分析像素信息, 写入特定点的像素信息
    首先把一个图像用Bitmap加载到内存。比如: image.fromfile("c:\aaa.bmp"), 或者已经在程序里的图像, 如me.BackgroundImage, 这里我们用前者作为例子。

    Dim pic As Bitmap
    pic = image.fromfile("c:\aaa.bmp")

    然后我们得到pic的一个像素的RGB。 因为RGB是长整数, 所以我们首先建立一个long, 然后得到pic在坐标为(x,y)的点, 然后把这个点上的RGB存到这个long里面去。

    Dim clr As Long
    clr = pic.getPixel(x,y).ToArgb

    现在我们需要分析这个RGB, 把它转换成R, G, 和B, 算法如下:

    Dim r As integer
    Dim g As integer
    Dim b As integer

    b = 255 + clr \ 256 \ 256
    g = 255 + (clr \ 256) Mod 256
    r = 255 + clr Mod 256

    如果要设定一个像素的到这个颜色信息, 我们可以这样做:

    pic.SetPixel(x, y, System.Drawing.Color.FromArgb(r, g, b))

    System.Drawing.Color.FromArgb(r,g,b)会给我们r,g,b所代表的颜色。

    颜色对比
    看颜色是否有差别, 或者差别有多大, 在处理图像中可以用来识别图像中突出的颜色或指定的颜色。
    我在制作一个软件的过程中弄了三种颜色对比方法, 我们从最初始和幼稚的看起, 一直到最后非常完善的。
    这里, 我们先定义几个整数值:
    r1, g1, b1, r2, g2, b2, t
    t是对比允许差别度, 其他的是两个颜色的r, g, b

    (1)Absolute RGB
    我们把r1-r2 看其绝对值是否小于 t, g1-g2, b1-b2...只要有一个不是小于t, 我们说这两个像素是不同的.

    if math.abs(r1-r2)>t or math.abs(g1-g2)>t or math.abs(b1-b2)>t then
    return false
    end if
    return true

    (2)Average RGB
    这里我们把所有的混起来加减了取平均, 其实取不取平均都随便, 反正是把RGB非常没有道理地加起来吧.
    if math.abs(r1+g1+b1-r2-g2-b2)/3 > t then
    return false
    end if
    return true

    (3)3D Path
    这里我们把r, g, b当作一个三维的空间, 看两个颜色间的距离。这是到现在为止最准确的方法, 虽然有可能可以直接对比开始得到的long, 但是那还需要试验。这个办法是绝对准确的:

    dim distance as single

    distance = Math.Sqrt(Math.Pow(r1-r2, 2) + Math.Pow(g1-g2, 2) + Math.Pow(b1-b2, 2))

    if distance > t then 
    return false
    end if
    return true


    图片保存

    Dim b As Bitmap = 想要保存的图片。

    b.Save("c:\picture.bmp", System.Drawing.Imaging.ImageFormat.Jpeg)

    左边的是文件名, 可以带文件路径,右边的是保存格式, 这里选择为保存成jpeg

    以上就是最基础的VB.NET图像处理方法了。 主要可以用于大量图像的处理或图像分析, 但是可能并不适合艺术创作哦。^-^
  • 相关阅读:
    Head of a Gang
    如何实现可以获取最小值的栈?
    多项式函数的极值点与拐点判别及个数公式
    解决Windows10下小娜无法搜索本地应用的问题
    Oracle中常用的语句
    [HTML]在页面中输出空格的几种方式
    [JavaScript]JS中的变量声明与有效域
    JAVA中时间格式转换
    Context initialization failed org.springframework.beans.factory.BeanCreationException
    Spring整合Mybatis SQL语句的输出
  • 原文地址:https://www.cnblogs.com/gosteps/p/3112740.html
Copyright © 2011-2022 走看看