1     Dim Flag(2097151)   As Byte
 2     Dim Pow2(7)         As Long
 3     Dim BitPos          As Long
 4     Dim BytePos         As Long
 5     For Y = 0 To 7
 6         Pow2(Y) = 2 ^ (7 – Y)
 7     Next
 8     For Y = 0 To m_Height – 1
 9         Speed = Y * m_Stride                                    ‘移动到下一行首个像素
10         For X = 0 To m_Width – 1
11             Index = ImageData(Speed + 2) + ImageData(Speed + 1) * 256& + ImageData(Speed) * 65536   ‘计算索引
12             BytePos = Index \ 8                                 ‘计算索引对应之字节位置
13             BitPos = Index And 7                                ‘计算索引对应之各类之职务
14             If (Flag(BytePos) And Pow2(BitPos)) = 0 Then        ‘判断改位是否也1
15                 Flag(BytePos) = Flag(BytePos) + Pow2(BitPos)    ‘不也1,则改为1
16                 Count = Count + 1                               ‘计数器增1
17             End If
18             Speed = Speed + 3                                   ‘移动到下一个像素
19         Next
20     Next

 
生活受到付出的顶多,却为忘记的人口是那么的基本上,可当您要帮忙的时刻他们总能挺身而出。

   注意,这里的排列有底凡VB的代码,实际上 ImageData(Speed + 1) * 256&这种表达式在勾选上高档优化时编译器会自动编译为错误移8各类之,而 Index \ 8则会优化为Index>>3,因此,速度高达未会见以及其余有这些运算符的语言有异样。当然,如果一直用类似VC的语言,请直接采用这些运算符。

                       ”””孤秋暮雪

 

    或许是自己不过认真,以后或一个丁失去面对这些!

 

明白

     
如果该职务的数组的值为0,则改也1,同时计数器增加1;如果为1,说明图像中前曾经是拖欠颜色,不做任何处理,直接处理下一个像素。

   

     
两种办法,在自己好的本机上编译后,居然是后一致种植算法的快快有,这个除了是分配内存时用的动的流年稍少把外,其他的实在是免知情,也许与内存的访问之类有关吧,我本着当时地方了解粗浅,还烦请有趣味的王牌指点。

 
据调查统计百分之七十的朋友看好爱人帮自己会认为您是该的辅助,没有啊感谢之,不会见看为极端付出那么多,觉得会动,反而你一旦无帮他们,他们认为您不好,连一沾小帮也不愿意帮。然而,让朋友吃您帮忙,却找不交总人口!

      接着,我们如果博需要看BytePos索引对应之字节的第几位。第几位,很粗略,就是颜色值的原始索引(Index变量)对8开展取余运算而已,可惜,取余运算符是个耗时的运算符,但同可正是,是对准8取余,And运算符能帮咱缓解。对8取余就算是对7进展And运算:
Index mod 8 == Index And 7 。 8我好尔。

  每当自己待支援的连续无奈的当电话仍中找着那些情侣!

      改良的法门也是好简单,也许大家还能想获得:既然每种颜色就有0和1点儿栽状态,那怎么并非位来记录该颜色是否存在过为。基于此想法,我们的数组大小就得改成16777216/8=2097152字节,即2MB大小。
     
这样做的利益内存占用量减少也本的1/8,坏处就是看位消息一旦比较一直看字节困难。不过出这样可怜的内存占用优势,困难是值得的。

                      ”””’2016年9月29日

 

 
 都觉着帮助朋友忙,朋友见面报你晤面铭记您对客的好为?我的答问是休!不!不!

      这个代码很简短,也死爱懂,不过令人未是老中意是16MB内存的占用,对于一副3000×4000之图像来说,也许没有啥概念,可如果本身是相同合300×400之图呢,这个内存比图本身占用的内存还格外过多,因此,我们计算对之地方展开恰当的改良。

   
我已救助对象做作业可要外帮忙的时,却力不从心被他行支援我!太多之心冷让人口及丁里面不见了互相帮助,存在在只有肯获得别人的给予帮助,自己却不情愿吗别人所救助!或许因为此缘故让越来越多之帮助者被一次次底失望,使得乐于助人的人数转移得越来越少!

      Index = Red + Green * 256 + Blue * 65536


 1     Dim Flag(16777215) As Byte
 2     For Y = 0 To m_Height – 1
 3         Speed = Y * m_Stride            ‘移动至下一行首个像素
 4         For X = 0 To m_Width – 1
 5             Index = ImageData(Speed + 2) + ImageData(Speed + 1) * 256& + ImageData(Speed) * 65536   ‘计算索引
 6             If Flag(Index) = 0 Then     ‘如果前从没起了该颜色值
 7                 Flag(Index) = 1         ‘该颜色值已经出现
 8                 Count = Count + 1       ‘计数加1
 9             End If
10             Speed = Speed + 3           ‘移动及下一个像素
11         Next
12     Next

反思

  统计   
首先,我们要定点某个颜色值在咱们新定义之数组中对应的索引BytePos,这个没有问题,直接除以8就足以了,8很特别,除以8可以优化为右变3员,右变是全速之运算符,很好。

     
因为我们只需要记录0和1少于种状态,因此布尔变量是较适宜的,不过有点语言,比如VB6,布尔种是挤占少单字节的。一般的编程语言中最好小的数据类型都是Byte,即一个字节,因此,16777216单极少得占用16MB的内存。简单表示代码如下:

      我们简要的看下实现之代码:

  一切真彩色图像,最多或行使的颜色数为256*256*256=16777216种植,但是平常状态下切免会见出诸如此类的多,因为就是图像遭到每个像素颜色都非同等,也至少需要4096×4096尺寸的觊觎,这么大小的图对当下的数码相机来说呢不广泛。因此,在现实中同入颜色颇丰富的彩色图像,其用的例外颜色数一般都未见面跳100万。本文介绍一栽简易而还要快速的统计是数额的点子。

 

     
一种植最简便而与此同时一直的方尽管是概念一个含有16777216个元素的一再组,然后循环整幅位图,对位图某处对应之颜色值,计算数组的目录,计算方式产生不少种植,比如:

     
关于大Pow2数组的使用,我发自我好表达能力有限,为什么来那种效果,其实明白人还是同一看就明白之。在就虽不多谈了。

 

     
下同样步,没啥好说的了,判断该位是否为0啊,这里我们还是假And运算,用该位的职位对应之非常规数据进行按位和运算,如果运算后的结果为0,则意味该颜色没有存在了,改变状态,并且将那个转呢1,改呢1之不二法门丰富我们的特殊数据即可,同时计数器加1,;如果不呢0(不用管他呢稍),则不用做其他处理了。