Как нарисовать изображение? - PullRequest
3 голосов
/ 10 июля 2011

Как я могу создать изображение с цветовым пространством 256x256, используя графическое рисование?В настоящее время я использую указатели, чтобы перебрать местоположение каждого пикселя и установить его.Синий идет от 0 ... 255 по X, а зеленый - от 0 ... 255 по Y. Изображение инициализируется следующим образом.

Bitmap image = new Bitmap(256, 256);
imageData = image.LockBits(new Rectangle(0, 0, 256, 256),
            ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
for (int row = 0; row < 256; row++)
{
    byte* ptr = (byte*)imageData.Scan0 + (row * 768);
    for (int col = 0; col < 256; col++)
    {
         ptr[col * 3] = (byte)col;
         ptr[col * 3 + 1] = (byte)(255 - row);
         ptr[col * 3 + 2] = 0;
    }
}

У меня есть ползунок, который идет на 0 ... 255Красный.При каждой прокрутке он проходит этот цикл и обновляет изображение.

for (int row = 0; row < 256; row++)
{
    byte* ptr = (byte*)imageData.Scan0 + (row * 768);
    for (int col = 0; col < 256; col++)
    {
         ptr[col * 3 + 2] = (byte)trackBar1.Value;
    }
}

Я выяснил, как использовать ColorMatrix вместо прокручиваемой части, но как я могу инициализировать изображение без использования указателей или SetPixel

Ответы [ 3 ]

3 голосов
/ 10 июля 2011

Прежде всего, добавьте элемент управления PictureBox в форму.

Затем этот код назначит разный цвет каждому пикселю на основе индекса в цикле и назначит изображение элементу управления:

Bitmap image = new Bitmap(pictureBox3.Width, pictureBox3.Height);
SolidBrush brush = new SolidBrush(Color.Empty);
using (Graphics g = Graphics.FromImage(image))
{
    for (int x = 0; x < image.Width; x++)
    {
        for (int y = 0; y < image.Height; y++)
        {
            brush.Color = Color.FromArgb(x, y, 0);
            g.FillRectangle(brush, x, y, 1, 1);
        }
    }
}
pictureBox3.Image = image;

По какой-то причине нет SetPixel или DrawPixel, как я ожидал, но FillRectangle будет делать то же самое, когда вы дадите ему 1x1 размеры для заполнения.

Обратите внимание, что для небольших изображений он будет работать нормально, но чем больше изображение, тем медленнее будет.

1 голос
/ 10 июля 2011

Если вы не хотите использовать указатели или SetPixel, вам придется построить градиент в байтовом массиве, а затем Marshal. Скопируйте его в ваше растровое изображение:

int[] b = new int[256*256];
for (int i = 0; i < 256; i++)
    for (int j = 0; j < 256; j++)
        b[i * 256 + j] = j|i << 8;

Bitmap bmp = new Bitmap(256, 256, PixelFormat.Format32bppRgb);
BitmapData bits = bmp.LockBits(new Rectangle(0, 0, 256, 256),
    ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);

Marshal.Copy(b, 0, bits.Scan0, b.Length);
0 голосов
/ 10 июля 2011

Это создаст белое изображение 256x256

Bitmap image = new Bitmap(256, 256);
using (Graphics g = Graphics.FromImage(image)){
    g.FillRectangle(Brushes.White, 0, 0, 256, 256);
}
...