社区
VB基础类 帖子详情 VB在picture控件里面画实心圆最快的方法是什么?circle太慢了 wuganxiu 2017-10-29 04:42:16 VB在picture控件里面画实心圆最快的方法是什么?circle太慢了
Picture1.FillColor = RGB(255,0,0)
Picture1.Circle (200, 200, 100, vbBlue
一次性画少一些还行,当一次性要画上万个的时候,速度就非常慢了
有什么可以快速画实心圆的方法没,谢谢
...全文
1724 22 打赏 收藏 VB在picture控件里面画实心圆最快的方法是什么?circle太慢了 VB在picture控件里面画实心圆最快的方法是什么?circle太慢了 Picture1.FillColor = RGB(255,0,0) Picture1.Circle (200, 200, 100, vbBlue 一次性画少一些还行,当一次性要画上万个的时候,速度就非常慢了 有什么可以快速画实心圆的方法没,谢谢 复制链接
扫一扫 分享 转发到动态 举报 AI 作业
写回复 配置赞助广告取 消
确 定
用AI写文章 22 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 wuganxiu 2017-11-03 打赏举报 回复 我的09年的机,测试了一下330这样,电脑确实老了 脆皮大雪糕 2017-11-02 打赏举报 回复 引用 20 楼 ayalicer 的回复:[quote=引用 17 楼 chewinggum 的回复:]
我这试了一下,1万个圆圈处理在70ms左右,差不多就在15帧左右
设置picturebox 的autoredraw属性效率提升明显。另外看楼主代码scalmode貌似用的是默认的twip建议 用Pixel
下面用的代码,窗体里面放一个picturebox 一个按钮 一个timer即可
用了timer可能会被吐槽,我只是为了省事,可以自己用循环去处理。
另外,如果只是为了界面演示,其实真不介意跳几帧
...
测试了下 我这边40左右 编译成exe 是30左右[/quote]
应该主要还看CPU,我的测试机是一台5年前的机器。 笨狗先飞 2017-11-01 打赏举报 回复 感觉楼主在做一个LED屏的编辑器,支持把gif导入到LED控制器里,然后实现一个预览功能。
脆皮大雪糕 2017-11-01 打赏举报 回复 我这试了一下,1万个圆圈处理在70ms左右,差不多就在15帧左右
设置picturebox 的autoredraw属性效率提升明显。另外看楼主代码scalmode貌似用的是默认的twip建议 用Pixel
下面用的代码,窗体里面放一个picturebox 一个按钮 一个timer即可
用了timer可能会被吐槽,我只是为了省事,可以自己用循环去处理。
另外,如果只是为了界面演示,其实真不介意跳几帧
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Dim r As Double
Const rad = 3.14 / 360
Private Sub Command1_Click()
Me.ScaleMode = 3
Picture1.Width = 500
Picture1.Height = 500
Picture1.FillStyle = 0
Picture1.ScaleMode = 3 '这两行是重点
Picture1.AutoRedraw = True
Timer1.Interval = 1
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Dim i As Integer
Dim j As Integer
Dim t As Long
t = GetTickCount
r = r + 10
For i = 1 To 100
For j = 1 To 100
' 画1万个圈圈,加了点动画免得觉得没动
Picture1.FillColor = RGB(128 * (Sin((Sqr(i ^ 2 + j ^ 2) + r) * rad * 10) + 1), 128 * (Sin((Sqr(i ^ 2 + j ^ 2) + r + 60) * rad * 10) + 1), 255)
Picture1.Circle (i * 5, j * 5), 2, vbBlack
Next
Next
Me.Caption = GetTickCount - t '在窗体标题栏显示单次渲染毫秒数,我这里显示在70毫秒以内 刚刚好在15帧左右
End Sub
砸死牛顿的苹果 2017-11-01 打赏举报 回复 引用 17 楼 chewinggum 的回复:我这试了一下,1万个圆圈处理在70ms左右,差不多就在15帧左右
设置picturebox 的autoredraw属性效率提升明显。另外看楼主代码scalmode貌似用的是默认的twip建议 用Pixel
下面用的代码,窗体里面放一个picturebox 一个按钮 一个timer即可
用了timer可能会被吐槽,我只是为了省事,可以自己用循环去处理。
另外,如果只是为了界面演示,其实真不介意跳几帧
...
测试了下 我这边40左右 编译成exe 是30左右 wuganxiu 2017-11-01 打赏举报 回复 谢谢各位老师 wuganxiu 2017-10-31 打赏举报 回复 好的,我做的东西其实很简单的,我先用GetDIBits函数采集一段视频或者动画的RGB值,然后提取其中1万个点RGB(30k的数据)的像素保存在.bin文件中,这个过程是正确的,速度10万个点每秒可以做到25帧,这里没有问题,采集的过程在Timer1_Timer()r控件里面完成
lrtn = GetDIBits(DC, iBitmap, 0&, iHeight, Bits1(0, 0, 0), bi24BitInfo, 0&)
ReleaseDC 0, DC
Dim r As Integer
Dim g As Integer
Dim b As Integer
''''''''''''''''''''''''''''''''''''''''''''''''''
Dim i4 As Long
For i = 0 To 99
For j = 0 To 99
Bits2(2, i, j) = Bits1(2, a2(i), b2(j)) ‘a2(i),b2(i)就是要采集点的坐标啦
Bits2(1, i, j) = Bits1(1, a2(i), b2(j))
Bits2(0, i, j) = Bits1(0, a2(i), b2(j))
'Bits1(2, i, j) = 255
'Bits1(1, i, j) = 0
'Bits1(0, i, j) = 0
Next j
Next i
'For ix = 0 To ik
Open "d:\1.bin" For Binary As #1
Put #1, k, Bits2
k = k + 30000(每次提取30k的数据,将这30K的数据保存到bin文件中)
Close #1
再者,采集完后,就要查看采集的效果怎么样,所以我就要把上面1.bin文件的数据显示到picture控件里面去
比如说我一共采集1万点,在picture控件上面显示1万个点
Dim Buff(0 to 29999) As Byte' 1万个点30k的数据
Open "d:\1.bin" For Binary As #1 ’打开1.bin文件
For i1 = 1 To 100 ‘采集了100帧,就得刷新100次,读取100次数据
Get #1, wei, Buff '每次提取30K的数据放到Buff中,wei为每次读取的位置,初始值1
wei = wei + 30000
Picture1.Cls
Picture1.Picture = LoadPicture()
For i = 0 To 99
For j = 0 To 99
wei1 = i*j+j ‘计算画的圆与采集的数据对应的坐标
Picture1.FillColor = RGB(Buff(wei1) * 2, Buff(wei1 + 1) * 2, Buff(wei1 + 2) * 2)‘给圆填充颜色
Picture1.Circle (a1(i), b1(j)), 100, vbBlue’画圆
Next j
Next i
Picture1.Picture = Picture1.Image
Next i1
Close #1
现在的的问题就是显示这块刷帧的时候太慢了,几千个点的时候蛮快的,就是Picture1.Circle (a1(i), b1(j)), 100, vbBlue’画圆这里太耗时间,显示几张图片,呵呵
熊孩子开学喽 2017-10-31 打赏举报 回复 每次上万个实心圆, 每秒15次刷新.
我觉得你还是把你最终需要做的东西给说一下吧, 你这个需求不见得就是合理的. of123 2017-10-31 打赏举报 回复 每个圆颜色不同,有一万个。你这一万种颜色是怎么配的?看的人怎么分得清一万种颜色? threenewbee 2017-10-31 打赏举报 回复 放在imagelist里,直接贴图 赵4老师 2017-10-31 打赏举报 回复 首先,没必要画成圆显示,因为实际的像素不是圆。
其次,就算要画成圆显示,也没必要用Circle语句逐个画圆,画一个圆到一幅小的Picture上,再用PaintPicture将小Picture画到大Picture上应比用Circle语句略快。嫌PaintPicture还不够快,还可以改用API BitBlt
最后,窗口中当前看不见的部分当然没必要画了。
另外,请参考这个软件:https://docs.microsoft.com/zh-cn/sysinternals/downloads/zoomit wuganxiu 2017-10-31 打赏举报 回复 是的,就是像素点放大显示 砸死牛顿的苹果 2017-10-31 打赏举报 回复 就是像素点放大成一个圆显示 wuganxiu 2017-10-30 打赏举报 回复 我的每个圆的颜色是不同的,而且要实时更新的,比如1秒钟更新15次这样,1万个圆都得更新的 of123 2017-10-30 打赏举报 回复 实际上,图片就是一个个像素的状态。采用画圆和填充的方式,是要实时对生成的像素进行计算处理,而且计算了两轮(画圆和填充)。如果还要实时改变显示,则更慢。
采用现成的实心圆,等于事先准备好了像素矩阵,直接贴进去。
处理过程中,最好将 Picture 控件设置为 visible = False。 of123 2017-10-30 打赏举报 回复 事先用 ImageList 控件保存内含不同直径实心圆的正方形图片(最好各边与圆相切,便于确定位置),用 PaintPicture 方法复制到 Picture 控件中。 脆皮大雪糕 2017-10-30 打赏举报 回复 这种需求根本就不需要考虑技术实现,根本就是伪需求,你即使用DX或OpenGL啥的搞定了,用的人看一眼也就叫你改了,根本没法用。劝你先确认需求。
脆皮大雪糕 2017-10-30 打赏举报 回复 就几个问题:这么多圆圈,这么高的刷新率,给特么谁看的?他会数你每个圈圈刷新几次么?少画几个圈圈,少刷新几次他看得出来么?你给他那么多圈圈他分得清楚哪个是哪个么?那一万多个圈圈圈的场景给他看过么?他骂你了没有? 赵4老师 2017-10-30 打赏举报 回复 1秒钟更新15次这样,1万个圆都得更新的?!
给谁看?
谁又能看得清?
你说你“1秒钟更新15次,1万个圆都更新”;我说你“1秒钟更新仅10次,1万个圆只更新了1000个”。谁来证明你对还是我对?怎么证明?
牛皮只适合用来吹吹。当真就钻牛角尖了。 wuganxiu 2017-10-30 打赏举报 回复 我想做一个采集GIF图片的像素,比如说采集1万个像素点,然后把这1万个像素点显示到picture里面,显示的时候像素点不能太小,并且显示的速度要跟上GIF图像变化的速度,也就是一边采集一边显示,基本要与GIF变化同步,采集可以用GetDIBits,然后再提取想要像素的坐标,就是显示这块,用picture.circle太慢了,阁下有什么好的建议吗,谢谢 加载更多回复(2) 最全的VB PictureBox控件使用教程 最全 VB PictureBox 控件使用教程 PictureBox 对象可以说是任何对象的原始型态,它可以加载图片、显示文 字、画图外,它还能..... 圆的画法(VB6.0源代码编写) 圆的画法(VB6.0源代码编写)
圆的画法,VB6.0源代码 VB 控件数组画图.rar VB 控件数组画图,每次输出新图形,前面的清除,可以画直线、矩形、圆。具体的代码操作,请看如下:
Private Sub Form_Load()
Picture1.Scale (0, 0)-(10, 10) '设置坐标系
End Sub
Private Sub Command1_Click(Index As Integer) '控件数组的单击事件
Picture1.Cls '每次输出新图形,前面的清除
Picture1.FillStyle = 6 '填充十字线形
Select Case Index 'index代表控件数组的索引号,用此分支结构判断用户单击了哪个按钮
Case 0 '用户单击控件数组里第一个命令按钮
Picture1.Print "画直线"
Picture1.Line (2, 2)-(7, 7) '在图片框上画直线
Case 1 '用户单击控件数组里第二个命令按钮
Picture1.Print "画矩形"
Picture1.Line (2, 2)-(7, 7), , BF '在图片框上画矩形
Case 2 '用户单击控件数组里第三个命令按钮
Picture1.Print "画圆" '在图片框上画圆
Picture1.Circle (4.5, 4.5), 3.5, , , , 1
Case Else '用户单击控件数组里第一个命令按钮
End
End Select
End Sub VB中PictureBox控件使用教程.doc VB中PictureBox控件使用教程 杨辉三角(VB6.0代码编写)杨辉三角使用Tab函数,演示如何在Picture控件上显示杨辉三角形。 杨辉三角(VB6.0代码编写)杨辉三角使用Tab函数,演示如何在Picture控件上显示杨辉三角形。
VB基础类
7,785
社区成员
197,585
社区内容
发帖 与我相关 我的任务 VB基础类 VB 基础类 复制链接
扫一扫 分享 确定 社区描述 VB 基础类 社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告 试试用AI创作助手写篇文章吧
+ 用AI写文章