Вопрос по c# – Путаница с Bitmap.Lockbits

7

Ссылка MSDN: [1]http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx#Y1178

Из ссылки написано, что первый аргумент будет «указывать часть растрового изображения для блокировки». который я установил как меньшую часть растрового изображения (растровое изображение 500x500, мой прямоугольник (0,0,50,50)), однако возвращенный BitmapData имеет шаг 1500 (= 500 * 3), поэтому в основном каждое сканирование будет сканировать через всю картину по горизонтали. Однако я хочу только верхнюю левую часть растрового изображения размером 50x50.

Как это работает?

Ваш Ответ

1   ответ
10

но свойство 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);

Таким образом, в действительности это просто блокировка всего растрового изображения, но предоставление вам указателя на верхний левый пиксель прямоугольника в растровом изображении и соответствующая установка ширины и высоты сканирования.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededGetPixelFormatSizeError: User Rate Limit Exceededmsdn.microsoft.com/en-us/library/…
Error: User Rate Limit Exceeded Binh Tran

Похожие вопросы