作者ioris (绮贞 真可爱)
看板C_Sharp
标题Re: [问题] BitmapData.Stride 疑问
时间Mon Mar 20 17:30:58 2006
※ 引述《cplusplus (C++)》之铭言:
: ※ 引述《ioris (绮贞 真可爱)》之铭言:
: : 请问 BitmapData.Stride 与 Width 用法有何不同
: : msdn写说
: : Stride : Bitmap 物件的分散宽度。
: : Width : Bitmap 物件的像素宽度。
: : 两者会相等吗??
: msdn的备注
: 分散宽度是单列像素 (扫描线) 的宽度,化约至四个位元组的界限。分散永远大於或等於
: 实际的像素宽度。如果分散为正,则点阵图为由上而下。如果分散宽度为负,则点阵图为
: 由下而上。
: --------------
: 别问我什麽意思,不是很清楚
: 不过印象中大概是BMP为了存取方便 每一条扫描线 也就是每一列PIXELS 所需要的BYTE数
: 都会凑到4的倍数(32bit电脑的word)大小 以方便存取跟增加效率 所以尾端可能有
: 0~3 bytes 是无意义的资料 填补用
不过之前用其他语言做影像处理,如 : C,C++,BCB....
似乎都没有考虑到这个问题
疑问来自於以下 C# 做灰阶的程式码
有没有大大能解释一下
stride width nOffset 的关系
public bool GrayScale(Bitmap b)
{
BitmapData bmData = b.LockBits(new Rectangle(0,0, b.Width, b.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride; //the length of the line
System.IntPtr Scan0 = bmData.Scan0;
unsafe
{
byte * p = (byte*)(void*)Scan0;
int nOffset = stride - b.Width*3;
byte red, green, blue;
for(int y=0;y < b.Height;++y)
{
for(int x=0; x < b.Width; ++x )
{
blue = p[0];
green = p[1];
red = p[2];
p[0] = p[1] = p[2] = (byte)(.299 * red
+ .587 * green + .114 * blue);
p += 3;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return true;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.135.8.149
1F:推 tasict:这是标准的bitmap格式呀...都是这样的..只是BCB避掉了 05/08 10:37