gpt4 book ai didi

c# - Bitmap.Lockbits 困惑

转载 作者:太空狗 更新时间:2023-10-29 20:10:57 31 4
gpt4 key购买 nike

MSDN 引用:[1] http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx#Y1178

从链接中可以看出,第一个参数将“指定要锁定的位图部分”,我将其设置为位图的较小部分(位图为 500x500,我的矩形为 (0,0,50,50 )) 但是返回的 BitmapData 的步幅为 1500 (=500*3) 所以基本上每次扫描仍然会水平扫描整个图片。然而,我想要的只是位图左上角的 50x50 部分。

这是如何解决的?

最佳答案

步幅始终是完整位图,但 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);

所以它基本上只是锁定了整个位图,但为您提供了一个指向位图中矩形左上角像素的指针,并适本地设置了扫描的宽度和高度。

关于c# - Bitmap.Lockbits 困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10771300/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com