首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bitmap.Lockbits混淆

Bitmap.Lockbits混淆
EN

Stack Overflow用户
提问于 2012-05-27 10:49:02
回答 1查看 7.1K关注 0票数 7

MSDN参考:1

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

这是如何实现的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-27 11:02:13

步幅将始终为全位图,但Scan0属性将根据锁定矩形的起点以及BitmapData的高度和宽度而有所不同。

这样做的原因是,您仍然需要知道位图的实际位宽,以便迭代各行(将步长添加到地址)。

一个简单的方法是:

代码语言:javascript
复制
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);

因此,它基本上只是锁定整个位图,但给你一个指针,指向位图中矩形的左上角像素,并适当地设置扫描的宽度和高度。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10771300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档