VB.NET aRGB轉換
在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图像处理方法了。 主要可以用于大量图像的处理或图像分析, 但是可能并不适合艺术创作哦。^-^
所谓擦除有两个方法, 一是用别的图覆盖, 二是在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图像处理方法了。 主要可以用于大量图像的处理或图像分析, 但是可能并不适合艺术创作哦。^-^
留言