Я использую следующий код для создания масок изображений на 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.
ОБНОВЛЕНИЕ:
Прочитав [Ссылка удалена, опасный сайт], как было предложено 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 означает отсутствие прозрачности в этом пикселе.
Я уверен, что вы легко сможете модифицировать цикл для рисования прямоугольника :)
Width
иHeight
вашегоBitmapData
объекта внутри ваших циклов. Доступ к этим свойствам вBitmap
сам замедлит код (это распространенная ошибка при обработке изображений .NET). - person MusiGenesis   schedule 15.09.2011