C # Bitmap с использованием небезопасного кода - PullRequest
19 голосов
/ 15 сентября 2011

Я использую следующий код для создания масок изображений в C #:

for(int x = 0; x < width; x++)
{
    for(int y = 0; y < height; y++)
    {
        bmp.SetPixel(x,y,Color.White);
    }
}

for(int x = left; x < width; x++)
{
    for(int y = top; y < height; y++)
    {
        bmp.SetPixel(x,y,Color.Transparent);
    }
}

Но это СЛИШКОМ МЕДЛЕННО ... Что является небезопасным эквивалентом этому? Будет ли это отведено быстрее?

В конце я делаю bmp.Save () в формате PNG.

UPDATE:

Прочитав http://www.bobpowell.net/lockingbits.htm, как предложено MusiGenesis, я заставил его работать, используя следующий код (для всех, кому это нужно):

Bitmap     bmp = new Bitmap(1000,1000,PixelFormat.Format32bppArgb);
BitmapData bmd = bmp.LockBits(new Rectangle(0, 0, bmp.Width,bmp.Height), 
                                  System.Drawing.Imaging.ImageLockMode.ReadWrite, 
                                  bmp.PixelFormat);

int PixelSize=4;

unsafe 
{
    for(int y=0; y<bmd.Height; y++)
    {
        byte* row=(byte *)bmd.Scan0+(y*bmd.Stride);

        for(int x=0; x<bmd.Width; x++)
        {
            row[x*PixelSize]     = 0;   //Blue  0-255
            row[x*PixelSize + 1] = 255; //Green 0-255
            row[x*PixelSize + 2] = 0;   //Red   0-255
            row[x*PixelSize + 3] = 50;  //Alpha 0-255
        }
    }
}

bmp.UnlockBits(bmd);

bmp.Save("test.png",ImageFormat.Png);

Альфа-канал: 0 - полностью прозрачный, 255 - нет прозрачности в этом пикселе.

Я уверен, что вы можете легко изменить цикл для рисования прямоугольника:)

1 Ответ

8 голосов
/ 15 сентября 2011

Ознакомьтесь с этим руководством по использованию LockBits:

http://www.BobPowell.net/lockingbits.htm

Это будет на несколько порядков быстрее, чем при использовании SetPixel.

...