2009-11-12 2 views
27

Мне нужно создать 24-битное растровое изображение (разрешение 100x100 пикселей) с использованием уникального цвета RGB и сохранить сгенерированное изображение на диск. В настоящее время я использую функцию SetPixel, но она очень медленная.Как заполнить растровое изображение сплошным цветом?

Bitmap Bmp = new Bitmap(width, height); 
//... 
//... 
Bmp.SetPixel(x,y,Color.FromARGB(redvalue, greenvalue, bluevalue)); 

Есть ли более быстрый способ, чем SetPixel? Заранее спасибо.

ответ

40

Это должно делать то, в чем вы нуждаетесь. Он заполнит весь растровый рисунок указанным цветом.

Bitmap Bmp = new Bitmap(width, height); 
using (Graphics gfx = Graphics.FromImage(Bmp)) 
using (SolidBrush brush = new SolidBrush(Color.FromArgb(redvalue, greenvalue, bluevalue))) 
{ 
    gfx.FillRectangle(brush, 0, 0, width, height); 
} 
+0

Большое спасибо. – Salvador

+0

Это показывает, как сделать растровое изображение из другого растрового изображения. –

+2

@SanuelJackson Итак, вы проигнорировали этот ответ, потому что он отвечает на фактический вопрос OPs, а не на заголовок его вопроса? –

6

Это зависит от того, что вы пытаетесь достичь, но обычно вы будете использовать GDI +, получая графический объект, а затем подходит к нему:

Graphics g = Graphics.FromImage(bitmap); 

Ее на самом деле большой вопрос, вот некоторые начинающие учебники: GDI+ Tutorials

Ниже приведен фрагмент учебника по рисованию прямоугольника с градиентной заливкой.

Rectangle rect = new Rectangle(50, 30, 100, 100); 
LinearGradientBrush lBrush = new LinearGradientBrush(rect, Color.Red, Color.Yellow, LinearGradientMode.BackwardDiagonal); 
g.FillRectangle(lBrush, rect); 
+0

+1 для GDI + предложение. – Salvador

3

Вы можете использовать LockBits ускорив записи пикселей (доступ указателя вместо вызова метода на пиксель).

2

Вы испорчены для выбора здесь :-)

Альтернативой использования GDI + является использование WPF (см RenderTargetBitmap.Render.)

Также см this question.

2

всегда Работа с регионов (прямоугольником) гораздо быстрее, чем при использовании отдельных пикселей.

7
Bitmap bmp = new Bitmap(width, height); 
Graphics g = Graphics.FromImage(bmp); 
g.Clear(Color.Green); 
+0

Не могли бы вы предоставить нам более подробную информацию, связанную с вашим ответом. Спасибо – Robert

+0

Это лучший ответ здесь. По моему опыту «Очистить» быстрее, чем вызывать «FillRectangle», когда вы очищаете весь образ. –

+0

Графика _ ** clear ** _ метод очищает всю поверхность чертежа и заполняет его указанным цветом фона. Нет необходимости вручную заполнять его, это вариант, который имеет _ ** clear ** _ метод. просмотрите объяснение [msdn] (https://msdn.microsoft.com/en-us/library/system.drawing.graphics.clear (v = vs.110) .aspx). –

0

Создание растрового объекта bmp размера s (высота, ширина) и цвета c.

bmp=CreateBmp(c , s); 

метод Теперь CreateBmp который возвращает битовую карту:

Bitmap CreateBmp(Color c, Size s) 
{ 
    Bitmap temp =new Bitmap(1,1); 
    temp.SetPixel(1,1,c); 
    return new Bitmap(temp, s); 
} 
Смежные вопросы