Bitmap.Lockbits混乱
MSDN参考:[1] http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx#Y1178
从链接中它说第一个参数将“指定要锁定的位图部分”,我将其设置为位图的较小部分(位图为500×500,我的矩形为(0,0,50,50))但是返回的BitmapData的步幅为1500(= 500 * 3),因此基本上每次扫描都会水平扫描整个图像。 但是,我想要的只是位图的左上角50×50部分。
这是如何工作的?
步幅将始终为完整位图,但Scan0属性将根据锁定矩形的起点以及BitmapData的高度和宽度而不同。
原因是你仍然需要知道位图的实际位宽,以便遍历行(添加步幅到地址)。
一个简单的方法是:
var bitmap = new Bitmap(100, 100); var data = bitmap.LockBits(new Rectangle(0, 0, 10, 10), ImageLockMode.ReadWrite, bitmap.PixelFormat); var pt = (byte*)data.Scan0; var bpp = data.Stride / bitmap.Width; for (var y = 0; y < data.Height; y++) { // This is why real scan-width is important to have! var row = pt + (y * data.Stride); for (var x = 0; x < data.Width; x++) { var pixel = row + x * bpp; for (var bit = 0; bit < bpp; bit++) { var pixelComponent = pixel[bit]; } } } bitmap.UnlockBits(data);
所以它基本上只是锁定整个位图,但是给你一个指向位图中矩形左上角像素的指针,并适当地设置扫描的宽度和高度。
- 对于操纵巨大的图形,F#或C#,哪种语言比另一种语言更合适?
- Google API / OAUTH / NativeApplicationClient / OAuth2Authenticator>退出?
- C#中标识符的@前缀
- 没有多重inheritance且没有代码重复的多重inheritance
- .net框架中的表达名称4
- ac#winforms应用程序中的电子邮件validation
- Active Directory:DirectoryEntry成员列表 GroupPrincipal.GetMembers()
- 使用隐式/显式转换而不是构造函数的原因是什么?
- 无法在CommonAppDataPath目录中修改C#中的ACL Perms