| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
大量收QQ微信精准粉/交友粉,非诚勿扰千里之行 始于足下
共有 347 人关注过本帖
标题:已知一个黑白照片每个像素点是黑或者白的byte数组,如何让PictureBox或者Im ...
只看楼主 加入收藏
ds_vb
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-5-11
结帖率:100%
  已结贴   问题点数:20  回复次数:6   
已知一个黑白照片每个像素点是黑或者白的byte数组,如何让PictureBox或者Image组件显示出来
已经得到一个PixelFormat为PixedFormat1bppIndexed的byte数组(即黑白图片),就是说每个像素点是黑或者白已经知道了,如何让PictureBox或者Image组件显示出来,还请各位不吝赐教,感谢!
2018-05-11 17:26
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:224
帖 子:4279
专家分:26116
注 册:2008-10-15
  得分:0 
使用绘图命令,逐点绘制出来。
可以使用 pset 一个点一个点的绘制(按原始比例),也可以使用 link 一个矩形代表一个点(等比例放大)。
也可以绘制在一个不显示的控件中,然后 复制到前台来(按任何比例放大或缩小)。

------------
优化方向:按行统计黑白点个数,使用link 命令绘直线方式绘图。
发现VB绘制同样大面积时,绘点比绘线要慢很多很多。


授人于鱼,不如授人于渔
早已停用QQ了
2018-05-12 17:21
ds_vb
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-5-11
  得分:0 
回复 2楼 风吹过b
感谢您的详细回答,PSet方法我试过了,由于一个像素点太小了,绘制出来看不到,我会试着用你说的用矩形代表一个点来试一下。
不过还想请教一下有没有更简单的方法,java和c#那边都挺简单的,有对应的方法,输入byte数组,就可以生成一个类似bitmap的类型,然后把bitmap塞到控件中就可以显示了。我在vb中用GdipCreateBitmapFromScan0 168, 44, 0, GpPixelFormat.PixelFormat1bppIndexed, ByVal pbSign(0), Bitmap 这个方法试过,但是bitmap怎么传给控件到现在还没有找到方法,还有就是这个方法中的第三个参数stride我不知道应该传什么数值,再次感谢!
2018-05-14 10:27
ds_vb
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-5-11
  得分:0 
回复 2楼 风吹过b
还想请教一下,说修改DrawWidth能放大像素点,我改大之后
For I = 0 To 167
        For j = 0 To 43
            signPicture.PSet (I, j), vbBlue
        Next j
    Next I
这个只能画出来一个点,而且只显示4分之一圆,感觉是控件左上角的点为原点画了一个圆,然后就不画其他的点了,还请不吝赐教,感谢!

[此贴子已经被作者于2018-5-14 11:42编辑过]

2018-05-14 11:09
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:224
帖 子:4279
专家分:26116
注 册:2008-10-15
  得分:20 
VB6

有二种方法,一种是自己写 函数 进行构造,这个部分我完成了一部分。
https://bbs.bccn.net/viewthread.php?tid=481230
在这个贴子里,我完成了对一个picturebox 的图像数据载入、载出,画点,画圆。
自己写函数实现的,没使用API函数。当然,在对BYTE转long 数据时,使用 一个API函数。自己实现速度会很慢。

另一种方法,API,我稍微百度了一下,GDI+ 也许能达到你的目的,但对API这一块我都不熟。


--------------------
以前写的一个程序的绘图代码,使用的 矩形代替像素点的方式。
这个文件的数据是,每个点1字节,1表示黑点,0表示白点。
程序代码:
'开始绘图
For i = 0 To ft.tk - 1
  For j = 0 To ft.tg - 1
    Get #1, , dd
    js = js + 1
    'm = ft.tk / 2 - j - i
'
校正坐标
    m = j
    n = ft.tk - i - 8
    'n = i
'
绘图
    If dd = 1 Then
'      p3.Line (m * bl, n * bl)-(m * bl + bl, n * bl + bl), RGB(0, 0, 0), BF
    Else
        gjs = gjs + 1
        p3.Line (m * bl, n * bl)-(m * bl, n * bl), mapC, BF
        'p3.Line (m * bl, n * bl)-Step(0, (j - y1)), g2

    End If
  Next j
'绘制进度条
  p4.Line (0, 0)-(i / ft.tk * p4.Width, p4.Height), RGB(0, 128, 128), BF
  DoEvents
Next i

授人于鱼,不如授人于渔
早已停用QQ了
2018-05-14 21:11
ds_vb
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-5-11
  得分:0 
回复 5楼 风吹过b
在此非常感谢您热心详细的解答,等我有时间我试一下您的建议。
我目前的解决方式是:用c++编写一个com组件,传入byte数组,添加bmp的头相关信息后,组装成一个bmp图像保存在本地,然后
Set img_Signature.Picture = LoadPicture("E:\666.bmp")

再次感谢!
2018-05-15 11:04
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:224
帖 子:4279
专家分:26116
注 册:2008-10-15
  得分:0 
VB6生成BMP格式,我大体上知道如何去实现,BMP头我也完全解析了,但第一次测试时,生成的图像有偏差,郁闷。
这个是直接生成BMP文件,测试失败,后面没去试着写代码了。

我现在这个是 函数 构造BMP,
这里是生在内存里导成一个空白的BMP格式,当前,因为VB6的限制,前面还有其他数据。
然后对这个BMP格式进行解析,分解成每一行,每一列,得到每个像素的 数据位置。
再对每个 像素的 颜色分量直接填值,最终完成 整个BMP数据的填充。
最后再显示出来。


授人于鱼,不如授人于渔
早已停用QQ了
2018-05-15 11:35







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041290 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved