Re: [問題] BitmapData.Stride 疑問

看板C_Sharp (C#)作者 (綺貞 真可愛)時間19年前 (2006/03/20 17:18), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《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
這是標準的bitmap格式呀...都是這樣的..只是BCB避掉了
05/08 10:37, 1F
文章代碼(AID): #147dDSPY (C_Sharp)
討論串 (同標題文章)
文章代碼(AID): #147dDSPY (C_Sharp)