一 : 新一代小米插线板正式发布 功能更加强大 触控开关
昨天晚上,小米插线板的研发方青米科技宣布将于明天上午9点推出新一代小米插线板,并表示这是"进化/归来"。这意味着,新一代小米插线板在功能上应该会更全面。
另外,考虑到小米智能家庭将在明天上午众筹一款新品,而且和电有关,所以这次众筹的主角很有可能就是青米科技这款全新的插线板。
如昨晚的预告,今天上午,小米生态链企业青米科技今天上午正式公布了新一代小米插线板,功能更加强大,号称“不变的颜值,更智能的插线板”。
此次公布的新款小米插线板是5孔位版本,不带USB接口(USB口版本预计很快就会发布)。外观方面和上一代产品类似,但原来的物理电源开关键变成了圆形(触控开关),插线板边缘也似乎更加圆润。
功能方面,新款小米插线板支持过载保护,通过mcu判断功耗大小,当功耗超过阀值,立即断开继电器,起到过载保护的作用。排除故障后,可手动回复或通过APP恢复正常工作状态。
此外,新插线板还支持漏电监测、节能、触控开关、定时计时、电力计量、自动学习等功能。
目前,新款小米插线板的售价、开售日期暂未公布。上一代的售价分别为39元、49元(USB版),大家猜猜新款会卖多少钱?
相关阅读:小米新品39元插线板和49元有什么区别? 小米39元插线板拆解图
二 : PhotoShop的自动色阶功能的实现
示例工程:http://files.cnblogs.com/laviewpbt/AutoLevel.rar.
关于自动色阶,用过PS的人应该都对他有所了解,在调整图像的视觉效果上这个调整滤镜的使用频率也是相当高的。[www.61k.com]关于其实现原理,网络上亦已经有不少人对其进行了探讨和研究,这里只是再简单的给有兴趣的人复习一下。
首先计算出一副图像的直方图,也就是每个色阶(0~255)所对应的像素点的个数,然后沿0阶->255阶方向找到最小色阶点Min(所谓最小色阶点即第一个在某一阶上有点数出现的阶数,如在0阶时为0点,1阶时为0点,2阶也为0点,3阶为10点,4阶为5点,...,那么最小点应为3阶), 同样最大值则是反方向从255阶开始第一个在某一阶上有点数出现的阶数Max.一般来讲,对以彩色图像最小色阶点=0,而最大色阶点为255。然后从最小色阶点开始选择整个图像总点数的5.5%的那一点做为新的最小点NewMin,再沿相反方向(即255阶->0阶方向)选择整个图像总点数的5.5%的那一点做为新的最大点NewMax,计两者之差为Differ,则每以原始像素点对应的新值可以按如下算法计算:
If Color <= NewMin Then
Color = 0
ElseIf Color >= NewMax Then
Color = 255
Else
Color = (Color - NewMin) * 255 / Differ
End If
这里我们假设你已经加载了一副24位真彩色图像到一个叫做Pic的图像容器中,并且为了方便我们设置其AutoRedraw为True,现在我们要对这副图像进行自动色阶的调整,除此之外,我们还希望处理的速度越快越好,首先我们请VB自带的Point和Pset函数站到一边去,他们处于图像处理的最低层(注意,不是最底层哦),接着,我们还要放弃对SetPixel和GetPixel的钟爱,因为他们和Point之流是一丘之貉。下一步,将目光瞄准GetBitmapBits和SetBitmapBits,哇,好名字,确实,这两个函数功能强大,但是我们不需要他们,因为他们是设备相关的,我不希望在我机器上能正常运行的程序在别人电脑上出现莫名其妙的效果。OK,还是请设备无关的函数GetDIBits,SetDIBits出山吧。关于这两个函数的使用方法,我不想详谈,但是你们可以记住,我们调用他们只是想快速的获得图像的点阵数据而已。
为了大家理解方便,这里我们设置图像的数据为一二维的RGBQUAD结构体,该结构体由四个分量组成,分别表示了颜色空间的Red,Green,Blue,Alpha分量(有的地方最后一个变量名为Reserved,但这不妨碍我们)。其中的Alpha因为VB的StdPicture对象不支持,我们不予以关心。
好了,下面给出获取PictureBox控件中图像数据的函数,以及怎么样把图像数据绘制到PictureBox中去。
模块中的代码:
DIB版本自动色阶
Option Explicit
'***************************模仿PS的自动色阶功能*********************************
'** 作者 : laviewpbt
'** 开发时间 : 2008.7.1
'** 最后修改时间 : 2008.8.28
'** 联系方式 : QQ:33184777
'** E-MAIL : laviewpbt@sina.com
'** All Rights Resered
'***********************************************************************
Public Type BITMAPFILEHEADER
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
bfType As Integer
bfSize As Long
bfReserved1 As Integer
bfReserved2 As Integer
bfOffBits As Long
End Type
Public Type Bitmap
bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long
End Type
Public Type BITMAPINFOHEADER '40 bytes
biSize As Long 'BITMAPINFOHEADER结构的大小
biWidth As Long
biHeight As Long
biPlanes As Integer '设备的为平面数,现在都是1
biBitCount As Integer '图像的颜色位图
biCompression As Long '压缩方式
biSizeImage As Long '实际的位图数据所占字节
biXPelsPerMeter As Long '目标设备的水平分辨率
biYPelsPerMeter As Long '目标设备的垂直分辨率
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
biClrUsed As Long '使用的颜色数
biClrImportant As Long '重要的颜色数。如果该项为0,表示所有颜色都是重要的
End Type
Public Type RGBQUAD '只有bibitcount为1,2,4时才有调色板
Blue As Byte '蓝色分量
Green As Byte '绿色分量
Red As Byte '红色分量
Reserved As Byte '保留值
End Type
Public Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER
bmiColors As RGBQUAD
End Type
Public Const BI_RGB = 0&
Public Const DIB_RGB_COLORS = 0&
Public Const IMAGE_BITMAP = 0&
Public Declare Function GetDIBits()Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Public Declare Function GetGDIObject()Function GetGDIObject Lib "gdi32.dll" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, ByRef lpObject As Any) As Long
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
Public Declare Function SetDIBits()Function SetDIBits Lib "gdi32" (ByVal Hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Public Declare Function GetTickCount()Function GetTickCount Lib "kernel32" () As Long
Public Declare Sub CopyMemory()Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDst As Any, lpSrc As Any, ByVal ByteLength As Long)
Public Declare Function VarPtrArray()Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
'得到图像数据
Public Function GetPicData()Function GetPicData(Pic As PictureBox, PicData() As RGBQUAD) As Boolean '读取位图数据
Dim Bmp As Bitmap, BmpInfo As BITMAPINFO
GetGDIObject Pic.Picture.Handle, Len(Bmp), Bmp '取得对指定对象进行说明的一个结构,
'hobject为位图,刷子等的句柄,
'count欲取回的字节数。通常是由lpObject定义的那个结构的长度
With BmpInfo.bmiHeader
.biSize = Len(BmpInfo.bmiHeader)
.biWidth = Bmp.bmWidth
.biHeight = -Bmp.bmHeight 'BMP位图默认的扫描方式是从下到上,
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
'这与GDI的坐标系统相反,为方便,这里
'改为-值,则取得数据就是以左上角为起点
.biPlanes = 1
.biBitCount = 32 '32位位图,默认情况下Windows不会处理最高8位
'可以将它作为自己的Alpha通道,取为32位位图,
'虽然多占用了点内存,但是避免了扫描行宽度问题,代码易于理解
.biCompression = BI_RGB '无压缩
.biSizeImage = Bmp.bmWidth * Bmp.bmHeight * 4
End With
ReDim PicData(0 To Bmp.bmWidth - 1, 0 To Bmp.bmHeight - 1) As RGBQUAD
GetDIBits Pic.Hdc, Pic.Image, 0, Bmp.bmHeight, PicData(0, 0), BmpInfo, DIB_RGB_COLORS
End Function
'根据数组显示图像
Public Sub SetPicData()Sub SetPicData(Pic As PictureBox, PicData() As RGBQUAD) '显示位图
Dim Bmp As Bitmap, BmpInfo As BITMAPINFO
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
GetGDIObject Pic.Picture.Handle, Len(Bmp), Bmp '取得对指定对象进行说明的一个结构,hobject为位图,刷子等的句柄,count欲取回的字节数。通常是由lpObject定义的那个结构的长度
With BmpInfo.bmiHeader
.biSize = Len(BmpInfo.bmiHeader)
.biWidth = Bmp.bmWidth
.biHeight = -Bmp.bmHeight 'BMP位图默认的扫描方式是从下到上,
'这与GDI的坐标系统相反,为方便,这里
'改为-值,则取得数据就是以左上角为起点
.biPlanes = 1
.biBitCount = 32 '32位位图,默认情况下Windows不会处理最高8位
'可以将它作为自己的Alpha通道,取为32位位图,
'虽然多占用了点内存,但是避免了扫描行宽度问题,代码易于理解
.biCompression = BI_RGB '无压缩
.biSizeImage = Bmp.bmWidth * Bmp.bmHeight * 4
End With
SetDIBits Pic.Hdc, Pic.Image, 0, Bmp.bmHeight, PicData(0, 0), BmpInfo, DIB_RGB_COLORS
Pic.Refresh
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
End Sub
以上的SetPicData和GetPicData分别为图像数据显示和读取函数,这里的.biBitCount = 32选择为32位虽然加大了内存的占用量,但是确在一定程度上方便了编程,因为Windows下的位图对象是要求扫描行对齐的,也就是说一行像素的占用字节数必须是4的倍数,之所以这样,我想是因为32位的Windows系统处理4个字节的速度最快吧。
窗体中有三个按钮一个图片框,图片框中请在设计的时候加载一副图像及设置相关参数。
窗体代码
DIB版本自动色阶
Option Explicit
Private m_Width As Long '打开的图像的宽度
Private m_Height As Long '打开的图像的高度
Private Sub Form_Load()Sub Form_Load()
m_Width = Pic.ScaleWidth
m_Height = Pic.ScaleHeight
End Sub
Private Sub CmdOpen_Click()Sub CmdOpen_Click()
CommonDialog.FileName = ""
CommonDialog.Filter = "All Suppported Images |*.bmp;*.jpg;*.gif;|BMP Images|*.bmp|JPG Images|*.jpg|Gif Images|*.gif"
CommonDialog.ShowOpen
If CommonDialog.FileName <> "" Then
Pic.Picture = LoadPicture(CommonDialog.FileName)
m_Width = Pic.ScaleWidth
m_Height = Pic.ScaleHeight
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
End If
End Sub
Private Sub CmdDib_Click()Sub CmdDib_Click()
Dim T As Long
Dim PicData() As RGBQUAD
Dim i As Long, j As Long
Dim HistRed(255) As Long, HistGreen(255) As Long
Dim HistBlue(255) As Long
Dim DiffRed As Long, DiffGreen As Long
Dim DiffBlue As Long, Diff As Long
Dim SpeedRed(255) As Byte, SpeedGreen(255) As Byte
Dim SpeedBlue(255) As Byte, Speed(255) As Byte
Dim Sum As Long, Integral As Long
Dim Min As Long, Max As Long
Dim NewMin As Long, NewMax As Long
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
T = GetTickCount
GetPicData Pic, PicData
For i = 0 To m_Width - 1
For j = 0 To m_Height - 1
HistRed(PicData(i, j).Red) = HistRed(PicData(i, j).Red) + 1
HistGreen(PicData(i, j).Green) = HistGreen(PicData(i, j).Green) + 1
HistBlue(PicData(i, j).Blue) = HistBlue(PicData(i, j).Blue) + 1
Next
Next
For i = 0 To 255
If HistRed(i) <> 0 Then
Min = i
Exit For
End If
Next
For i = 255 To 0 Step -1
If HistRed(i) <> 0 Then
Max = i
Exit For
End If
Next
Sum = 0
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
For i = Min To Max
Sum = Sum + HistRed(i)
Next
Integral = 0
For i = Min To Max
Integral = Integral + HistRed(i)
If Integral >= Sum * 0.005 Then
NewMin = i
Exit For
End If
Next
For i = NewMin + 1 To Max
Integral = Integral + HistRed(i)
If Integral > Sum * 0.995 Then
NewMax = i
Exit For
End If
Next
For i = 0 To 255
If i <= NewMin Then
SpeedRed(i) = 0
ElseIf i >= NewMax Then
SpeedRed(i) = 255
Else
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
SpeedRed(i) = (i - NewMin) / (NewMax - NewMin) * 255
End If
Next
/**/''''''''''''''''''''''''''''
For i = 0 To 255
If HistGreen(i) <> 0 Then
Min = i
Exit For
End If
Next
For i = 255 To 0 Step -1
If HistGreen(i) <> 0 Then
Max = i
Exit For
End If
Next
Sum = 0
For i = Min To Max
Sum = Sum + HistGreen(i)
Next
Integral = 0
For i = Min To Max
Integral = Integral + HistGreen(i)
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
If Integral >= Sum * 0.005 Then
NewMin = i
Exit For
End If
Next
For i = NewMin + 1 To Max
Integral = Integral + HistGreen(i)
If Integral > Sum * 0.995 Then
NewMax = i
Exit For
End If
Next
For i = 0 To 255
If i <= NewMin Then
SpeedGreen(i) = 0
ElseIf i > NewMax Then
SpeedGreen(i) = 255
Else
SpeedGreen(i) = (i - NewMin) / (NewMax - NewMin) * 255
End If
Next
/**/'''''''''''''''''''''''''
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
For i = 0 To 255
If HistBlue(i) <> 0 Then
Min = i
Exit For
End If
Next
For i = 255 To 0 Step -1
If HistBlue(i) <> 0 Then
Max = i
Exit For
End If
Next
Sum = 0
For i = Min To Max
Sum = Sum + HistBlue(i)
Next
Integral = 0
For i = Min To Max
Integral = Integral + HistBlue(i)
If Integral >= Sum * 0.005 Then
NewMin = i
Exit For
End If
Next
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
For i = NewMin + 1 To Max
Integral = Integral + HistBlue(i)
If Integral > Sum * 0.995 Then
NewMax = i
Exit For
End If
Next
For i = 0 To 255
If i <= NewMin Then
SpeedBlue(i) = 0
ElseIf i > NewMax Then
SpeedBlue(i) = 255
Else
SpeedBlue(i) = (i - NewMin) / (NewMax - NewMin) * 255
End If
Next
For i = 0 To m_Width - 1
For j = 0 To m_Height - 1
PicData(i, j).Red = SpeedRed(PicData(i, j).Red)
PicData(i, j).Green = SpeedGreen(PicData(i, j).Green)
PicData(i, j).Blue = SpeedBlue(PicData(i, j).Blue)
Next
Next
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
SetPicData Pic, PicData
Me.Caption = "DIB方法用时" & GetTickCount - T & "毫秒"
End Sub
好了,任务完成了,编译测试一下,勾选上所有的高级优化选项,测试图片大小选为1024*768,结果显示需要300ms,啊,如此慢,PS中一点就出来了效果呢,仔细分析下代码结构,似乎能够优化的地方已经基本优化了,那问题主要是那里呢。
其实,在这里耗时的几个主要过程有,读取图像数据、计算直方图、计算新的图像数据、显示图像数据,其中又以中间两个过程为主。我们采用了二维结构体数组,众所周知,访问数组需要计算数组元素在内存中位置,而维数越高,计算地址的公式就越复杂,因此,如果能采用一维数组的方式理论上是要比二维的速度有所改进的,这部分测试可以用读者自己完成。
这里要说的是另外一种提速的方法,模拟指针。其实这个词有很多人应该见过很多次了。虽然VB不直接支持指针的操作,但是借助于安全数据的相关特性,我们可以实现类似于C的指针(包括功能和代码的编辑方式).那么这里我们用模拟指针的好处很明显。第一:我们不需要调用GetDIBits这个函数,这意味着两种节省,其一是空间上的,GetDIBits函数需要你为他事先分配好一定的内存空间来保存图像数据。但是实际上,图像已经被我们加载入picturebox中,那么在内存中他肯定已经占用了空间,我们可以利用GetGDIObject这个函数配以适当的参数得到这个内存空间的首地址。其二是时间上的,分配空间和填充数据都是耗时的,虽然这个时间很少。第二,可以减少寻址的时间消耗, 用模拟指针的过程也需要寻址。但是适当的利用中间变量保存相关地址,可以节省大量的计算时间,比如你用二维结构体保存图象数据,要得到图象在(i,j)点的红色和兰色和绿色数据,则要调用Data(i,j).Red和Data(i,j).Blue、Data(i,j).Green,这里三次调用则三次寻址,每次寻址的过程类似于下面的公式 j*width+i+Offset,一次乘法,二次加法,如果我们自己寻址,则用临时变量保存j*width+i值,则会减少计算量。对于大循环则更是明显。
好了说了这么多,下面给出代码。
模拟指针版自动色阶
'***************************自动色阶的模拟指针实现*********************************
'** 作者 : laviewpbt
'** 开发时间 : 2008.7.1
'** 最后修改时间 : 2008.8.28
'** 联系方式 : QQ:33184777
'** E-MAIL : laviewpbt@sina.com
'** Blog : http://www.cnblogs.com/laviewpbt/
'** All Rights Resered,转载请保留以上信息
'***********************************************************************
Private Sub CmdPointer_Click()Sub CmdPointer_Click()
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
Dim i As Long, j As Long
Dim DataArr(0 To 3) As Byte, pDataArr(0 To 0) As Long
Dim OldArrPtr As Long, OldpArrPtr As Long
Dim LineAddBytes As Long, PixelAddBytes As Long
Dim Bmp As Bitmap, T As Long
Dim HistRed(255) As Long, HistGreen(255) As Long
Dim HistBlue(255) As Long
Dim DiffRed As Long, DiffGreen As Long
Dim DiffBlue As Long, Diff As Long
Dim SpeedRed(255) As Byte, SpeedGreen(255) As Byte
Dim SpeedBlue(255) As Byte, Speed(255) As Byte
Dim Sum As Long, Integral As Long
Dim Min As Long, Max As Long
Dim NewMin As Long, NewMax As Long
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
T = GetTickCount
GetGDIObject Pic.Picture.Handle, Len(Bmp), Bmp
If Bmp.bmBits <> 0 Then '是个有效的图片
If Bmp.bmBitsPixel < 24 Then Exit Sub '不处理费真彩色图像,实际上,VB的picture属性也支持8位索引色的Bmp,如果你为了节省内存,采用改格式的图片,可以自行修改代码。
MakePoint VarPtrArray(DataArr), VarPtrArray(pDataArr), OldArrPtr, OldpArrPtr
PixelAddBytes = Bmp.bmBitsPixel / 8 '可为3,可为4
pDataArr(0) = Bmp.bmBits '首地址
LineAddBytes = Bmp.bmWidthBytes - (Bmp.bmBitsPixel \ 8) * Bmp.bmWidth '每个扫描行额外多出的字节
For j = 1 To m_Height
For i = 1 To m_Width
HistRed(DataArr(2)) = HistRed(DataArr(2)) + 1
HistGreen(DataArr(1)) = HistGreen(DataArr(1)) + 1
HistBlue(DataArr(0)) = HistBlue(DataArr(0)) + 1
pDataArr(0) = pDataArr(0) + PixelAddBytes
Next
pDataArr(0) = pDataArr(0) + LineAddBytes
Next
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
For i = 0 To 255
If HistRed(i) <> 0 Then
Min = i
Exit For
End If
Next
For i = 255 To 0 Step -1
If HistRed(i) <> 0 Then
Max = i
Exit For
End If
Next
Sum = 0
For i = Min To Max
Sum = Sum + HistRed(i)
Next
Integral = 0
For i = Min To Max
Integral = Integral + HistRed(i)
If Integral >= Sum * 0.005 Then
NewMin = i
Exit For
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
End If
Next
For i = NewMin + 1 To Max
Integral = Integral + HistRed(i)
If Integral > Sum * 0.995 Then
NewMax = i
Exit For
End If
Next
For i = 0 To 255
If i <= NewMin Then
SpeedRed(i) = 0
ElseIf i >= NewMax Then
SpeedRed(i) = 255
Else
SpeedRed(i) = (i - NewMin) / (NewMax - NewMin) * 255
End If
Next
/**/''''''''''''''''''''''''''''
For i = 0 To 255
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
If HistGreen(i) <> 0 Then
Min = i
Exit For
End If
Next
For i = 255 To 0 Step -1
If HistGreen(i) <> 0 Then
Max = i
Exit For
End If
Next
Sum = 0
For i = Min To Max
Sum = Sum + HistGreen(i)
Next
Integral = 0
For i = Min To Max
Integral = Integral + HistGreen(i)
If Integral >= Sum * 0.005 Then
NewMin = i
Exit For
End If
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
Next
For i = NewMin + 1 To Max
Integral = Integral + HistGreen(i)
If Integral > Sum * 0.995 Then
NewMax = i
Exit For
End If
Next
For i = 0 To 255
If i <= NewMin Then
SpeedGreen(i) = 0
ElseIf i > NewMax Then
SpeedGreen(i) = 255
Else
SpeedGreen(i) = (i - NewMin) / (NewMax - NewMin) * 255
End If
Next
/**/'''''''''''''''''''''''''
For i = 0 To 255
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
If HistBlue(i) <> 0 Then
Min = i
Exit For
End If
Next
For i = 255 To 0 Step -1
If HistBlue(i) <> 0 Then
Max = i
Exit For
End If
Next
Sum = 0
For i = Min To Max
Sum = Sum + HistBlue(i)
Next
Integral = 0
For i = Min To Max
Integral = Integral + HistBlue(i)
If Integral >= Sum * 0.005 Then
NewMin = i
Exit For
End If
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
Next
For i = NewMin + 1 To Max
Integral = Integral + HistBlue(i)
If Integral > Sum * 0.995 Then
NewMax = i
Exit For
End If
Next
For i = 0 To 255
If i <= NewMin Then
SpeedBlue(i) = 0
ElseIf i > NewMax Then
SpeedBlue(i) = 255
Else
SpeedBlue(i) = (i - NewMin) / (NewMax - NewMin) * 255
End If
Next
pDataArr(0) = Bmp.bmBits
For j = 1 To m_Height
For i = 1 To m_Width
DataArr(2) = SpeedRed(DataArr(2))
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
DataArr(1) = SpeedGreen(DataArr(1))
DataArr(0) = SpeedBlue(DataArr(0))
pDataArr(0) = pDataArr(0) + PixelAddBytes
Next
pDataArr(0) = pDataArr(0) + LineAddBytes
Next
FreePoint VarPtrArray(DataArr), VarPtrArray(pDataArr), OldArrPtr, OldpArrPtr
Pic.Refresh
End If
Me.Caption = "模拟指针用时" & GetTickCount - T & "毫秒"
End Sub
Private Sub MakePoint()Sub MakePoint(ByVal DataArrPtr As Long, ByVal pDataArrPtr As Long, ByRef OldArrPtr As Long, ByRef OldpArrPtr As Long)
Dim Temp As Long, TempPtr As Long
CopyMemory Temp, ByVal DataArrPtr, 4 '得到DataArrPtr的SAFEARRAY结构的地址
Temp = Temp + 12 '这个指针偏移12个字节后就是pvData指针
CopyMemory TempPtr, ByVal pDataArrPtr, 4 '得到pDataArrPtr的SAFEARRAY结构的地址
TempPtr = TempPtr + 12 '这个指针偏移12个字节后就是pvData指针
CopyMemory OldpArrPtr, ByVal TempPtr, 4 '保存旧地址
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
CopyMemory ByVal TempPtr, Temp, 4 '使pDataArrPtr指向DataArrPtr的SAFEARRAY结构的pvData指针
CopyMemory OldArrPtr, ByVal Temp, 4 '保存旧地址
End Sub
Private Sub FreePoint()Sub FreePoint(ByVal DataArrPtr As Long, ByVal pDataArrPtr As Long, ByVal OldArrPtr As Long, ByVal OldpArrPtr As Long)
Dim TempPtr As Long
CopyMemory TempPtr, ByVal DataArrPtr, 4 '得到DataArrPtr的SAFEARRAY结构的地址
CopyMemory ByVal (TempPtr + 12), OldArrPtr, 4 '恢复旧地址
CopyMemory TempPtr, ByVal pDataArrPtr, 4 '得到pDataArrPtr的SAFEARRAY结构的地址
CopyMemory ByVal (TempPtr + 12), OldpArrPtr, 4 '恢复旧地址
End Sub
编译后测试,同样1024*768大小的图片,用模拟指针方法只需32ms左右,这个时间人是基本看不到延迟的。用VC的话也就在这个时间范围内。
怎么样,对VB的信心是不是又增加了不少,是的,VB一直是很优秀的。以前是,现在是,将来也是。
示例工程中有部分代码和本文中给出的不一致,但这不影响大局。
'******************************你的评论是我发表文章的极大动力**'**************************
'***************************欢迎和你讨论图像技术问题:QQ 33184777************************
扩展:photoshop自动色阶 / photoshop色阶 / photoshop色阶在哪
三 : 成功,源自突破现实
在当今世界,没有一个人在世界上或者国家中的地位是指定的,也不会有永久的王。正如一个企业应在逆境中努力进取以求生存,在顺境中也应有足够的忧患意识,想要成功,想要保持成功者的地位,就必需要突破现实。
每一个成功者,或者基本上所有的成功人士,都经历过大量挫折才走到今天这个地位,“每一个成功的企业家都会有他成功的地方,每个失败的企业家都有他失败的理由。”所有的成功者都引领着自己的团队不断突破,但如果其中一个人停下脚步,坐享安乐,那么失败就离他不远了。这个方面最有力的例子就是当年的市场霸主诺基亚公司,当年他曾经雄霸了整个电子产品市场,拥有无人可比的市场创新能力,这源于它铭记于心的忧患意识,它从不满足现实所取得的成就,走在科技前沿。可现在,在身边已经难觅诺基亚的身影了,因为诺基亚公司在取得巨大成就后,便十分“傲慢”,没能赶上时代步伐,被日益强大的苹果三星,HTC踩在脚下,在三次大裁员仍未解决资金问题后,申请了破产保护,最终被微软收购。
因为忧患意识而取得成功的例子有很多,如苹果公司从1976年的默默无闻到现在人尽皆知的高端手机领导者,大量竞争对手使它充满忧患意识,激发了它创新的无限潜力,它不断突破现实,股价连连增长,已突破6000亿美元。确实,也必须承认,有些企业靠模仿也在这个市场上生存了下来,如在Iphone5上市,十天后夏星公司和AWP公司便相继推出了五代智能机,比iPhone便宜很多,虽然销量上远远不及,但没有任何亏损,由于不少功能不及iPhone,用的是安卓系统,所以苹果公司也就睁只眼闭只眼,也就这样获利不少。不过,这种公司再怎么获利,没有突破肯定不会有长久生存的机会,这些公司会永远默默无闻,被其他有创新的品牌,被国际市场小视,最后迟早会被时代淘汰。
生活中我们也应该有足够的忧患意识,生活中的每一件事做完美了或者做成了都会是一种锻炼,时代在发展,也许有时除了学习以外多了解科技方面的发展也不是坏事,有些时候不断努力地突破一件你办不到的事情也可能成为未来成功的基础,现实未必是绝对的,花费一些本可以自由的时间研究感兴趣的东西,未来也就可能变得更成功。
当我们生活的世界不断改变,我们必须跟上脚步,走在时代的前沿,了解更多科技和未来,做好我们的本职工作。未来,指在突破现实,走向成功的彼岸!
上海松江区民办包玉刚实验学校(初中部)初二:Ricky Yu
本文标题:
轻触开关实现自锁功能-新一代小米插线板正式发布 功能更加强大 触控开关 本文地址:
http://www.61k.com/1165625.html