找回密码
 加入
搜索
查看: 3439|回复: 2

[图形处理] gdi图像处理中stride该如何理解?

[复制链接]
发表于 2014-12-11 20:57:16 | 显示全部楼层 |阅读模式
还是seniors的验证码贴子(位置不固定验证码例子http://www.autoitx.com/viewthrea ... =%D1%E9%D6%A4%C2%EB)
有两句
Local $a_return[$iwidth][$iheight], $x, $y, $s
        For $y = 0 To $iheight - 1
                $s = StringMid($s_BMPData, $y * ($i_Stride * 2) + 1, $iwidth * 6)
                For $x = 0 To $iwidth - 1
                        $a_return[$x][$y] = Number("0x" & StringMid($s, $x * 6 + 1, 6))
                Next
        Next
$i_Stride * 2 , $iwidth * 6,$x * 6   是怎么来的啊?
看了msdn,stride要比width要宽一些,但这几个倍数不知从何而来
望朋友们解惑,谢谢先
 楼主| 发表于 2014-12-11 22:26:10 | 显示全部楼层
$i_Stride  , $iwidth * 3
这样就好理解了,不知为何要扩大2倍?
 楼主| 发表于 2014-12-12 08:27:40 | 显示全部楼层
刚看到一篇C#像素有关的文章http://www.cnblogs.com/freeliver ... /12/14/1354602.html
也是3的倍数,而不是6.这是啥原因呢?
--------------原文片段----------------------------------------------------------------------------------------
毫无疑问,采用这种方式是最快的,所以在实际工程中都是采用指针的方式来访问图像像素的。   字节对齐问题
    上例中ptr += data.Stride - data.Width * 3,表示跨过无用的区域,其原因是图像数据在内存中存储时是按4字节对齐的,具体解释如下:     假设有一张图片宽度为6,假设是Format24bppRgb格式的(每像素3字节,在以下的讨论中,除非特别说明,否则Bitmap都被认为是24位RGB)。显然,每一行需要6*3=18个字节存储。对于Bitmap就是如此。但对于BitmapData,虽然data.Width还是等于image.Width,但大概是出于显示性能的考虑,每行的实际的字节数将变成大于等于它的那个离它最近的4的整倍数,此时的实际字节数就是Stride。就此例而言,18不是4的整倍数,而比18大的离18最近的4的倍数是20,所以这个data.Stride = 20。显然,当宽度本身就是4的倍数时,data.Stride = image.Width * 3。     画个图可能更好理解。R、G、B 分别代表3个原色分量字节,BGR就表示一个像素。为了看起来方便我在们每个像素之间插了个空格,实际上是没有的。X表示补足4的倍数而自动插入的字节。为了符合人类的阅读习惯我分行了,其实在计算机内存中应该看成连续的一大段。 |-------Stride-----------|
|-------Width---------| |
Scan0:
BGR BGR BGR BGR BGR BGR XX
BGR BGR BGR BGR BGR BGR XX
BGR BGR BGR BGR BGR BGR XX
.
.
.     首先用data.Scan0找到第0个像素的第0个分量的地址,这个地址指向的是个byte类型,所以当时定义为byte* ptr。行扫描时,在当前指针位置(不妨看成当前像素的第0个颜色分量)连续取出三个值(3个原色分量。注意,0 1 2代表的次序是B G R。在取指针指向的值时,貌似p[n]和p += n再取p[0]是等价的),然后下移3个位置(ptr += 3,看成指到下一个像素的第0个颜色分量)。做过Bitmap.Width次操作后,就到达了Bitmap.Width * 3的位置,应该要跳过图中标记为X的字节了(共有Stride - Width * 3个字节),代码中就是 ptr += dataIn.Stride - dataIn.Width * 3。     通过阅读本文,相信你已经对使用C#进行图像处理可能用到的几种方法有了一个了解。至于采用哪种方式,取决于你的性能要求。其中第一种方式最优雅;第三种方式最快,但不是安全代码;第二种方式取了个折中,保证是安全代码的同时又提高了效率。熟悉C/C++编程的人可能会比较偏向于第三种方式,我个人也比较喜欢第三种方式
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 07:22 , Processed in 0.080193 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表