GDI +: как вы визуализируете графический объект для растрового изображения в фоновом потоке? - PullRequest
3 голосов
/ 27 мая 2009

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

private void RotationMenu_Click(object sender, System.EventArgs e)
{
    Graphics g = this.CreateGraphics();
    g.Clear(this.BackColor);
    Bitmap curBitmap = new Bitmap(@"roses.jpg"); 
    g.DrawImage(curBitmap, 0, 0, 200, 200);  

    // Create a Matrix object, call its Rotate method,
    // and set it as Graphics.Transform
    Matrix X = new Matrix();
    X.Rotate(30);
    g.Transform = X;  

    // Draw image
    g.DrawImage(curBitmap, 
    new Rectangle(205, 0, 200, 200), 
        0, 0, curBitmap.Width, 
        curBitmap.Height, 
        GraphicsUnit.Pixel);  

    // Dispose of objects
    curBitmap.Dispose();
    g.Dispose(); 
} 

Мой вопрос состоит из двух частей:

  1. Как бы вы достигли this.CreateGraphics() в фоновом потоке? Является ли это возможным? Насколько я понимаю, в этом примере объект пользовательского интерфейса this. Так что, если я делаю эту обработку в фоновом потоке, как бы я создал графический объект?

  2. Как мне затем извлечь растровое изображение из графического объекта, который я использую, когда я закончу обработку? Мне не удалось найти хороший пример того, как это сделать.


Также: при форматировании кода, как добавить новые строки? Если бы кто-то мог оставить мне комментарий, объясняющий, что я действительно ценю это. Спасибо!

1 Ответ

12 голосов
/ 27 мая 2009

Чтобы рисовать на растровом изображении, вы не хотите создавать Graphics объект для элемента управления пользовательского интерфейса. Вы создаете объект Graphics для растрового изображения, используя метод FromImage:

Graphics g = Graphics.FromImage(theImage);

A Graphics объект не содержит графику, которую вы рисуете на нем, вместо этого это просто инструмент для рисования на другом холсте, обычно на экране, но это также может быть Bitmap объект. *

Итак, сначала вы не рисуете, а затем извлекаете растровое изображение, сначала создаете растровое изображение, а затем создаете объект Graphics для рисования на нем:

Bitmap destination = new Bitmap(200, 200);
using (Graphics g = Graphics.FromImage(destination)) {
   Matrix rotation = new Matrix();
   rotation.Rotate(30);
   g.Transform = rotation;
   g.DrawImage(source, 0, 0, 200, 200);
}
...