Re: [問題] BitmapData.Stride 疑問
※ 引述《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
推
05/08 10:37, , 1F
05/08 10:37, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章