Рисование с использованием растрового изображения в PictureBox в C#

мой первый вопрос здесь. И я уверен, что это легко, но я нигде не могу найти решение, я много читал и просто не могу понять, как мне нужно сделать:

  • У меня есть файл *.gif, который я хочу сохранить в System.Drawing.Bitmap, чтобы иметь доступ к методу GetPixel()
  • Я хочу, чтобы мой рисунок находился под некоторым контролем (в настоящее время пробую PictureBox)

Пока что у меня есть:

  • Я создаю шаблон, Bitmap из файла - и это работает (map_t в коде)
  • Я создаю растровое изображение, которое на самом деле будет отрисовано (map)
  • I can set my PictureBox image to a bitmap
    • I can't change this bitmap. Or I can, but the result doesn't show
    • Я думал, что мне придется создать Graphic из этого растрового изображения, а затем изменить его. Я понятия не имею, что мне не хватает.

Вот код: MapCanvas — это PictureBox на форме, все в MouseMove, потому что я пытался сделать несколько кругов вокруг указателя — не получилось, так что в итоге я получил этот код, который тоже не работает. Я прочитал все вопросы, которые смог найти, ничего не помогает... Вот код:

namespace Projekt_innowacje
{
    public partial class MapForm : Form
    {
        Bitmap map_t;
        Bitmap map;

        public MapForm()
        {
            InitializeComponent();
            map_t = new Bitmap("map.gif", true);
            map = new Bitmap(map_t.Width, map_t.Height);
            MapCanvas.Image = map;
        }

        private void MapCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            Graphics canvas = Graphics.FromImage(map);
            for (int i = 0; i <= map.Width; i++)
                for (int j = 0; j <= map.Height; j++)
                    if (map.GetPixel(i, j) == Color.Red)
                        canvas.DrawLine(new Pen(Color.Blue), i, j, i + 1, j + 1);

                        // map.SetPixel(i, j, map.GetPixel(i, j)); // also doesn't work         

            //MapCanvas.Refresh(); 
            MapCanvas.Invalidate();

            canvas.Dispose();
        }
    }
}

person wasyl    schedule 30.04.2012    source источник
comment
Вы пробовали использовать BMP или JPEG? GIF-файлы используют индексированный цвет и обычно не могут быть использованы произвольно.   -  person Ani    schedule 01.05.2012
comment
Это не проблема, так как я читаю только пиксель из файла GIF. Как видите, я пытаюсь рисовать на новом пустом растровом изображении размером с gif-файл.   -  person wasyl    schedule 01.05.2012


Ответы (1)


Код, который вы показываете, никогда не изменит изображение холста/карты, если вы не внесете какие-либо другие изменения в изображение map, которым вы не делитесь. В вашем цикле вы проверяете map.GetPixel, однако map создается как пустое изображение в конструкторе, поэтому ни один из его пикселей никогда не будет Color.Red. Вместо этого вы намеревались протестировать свой шаблон?

Кроме того, вы можете взглянуть на этот вопрос, в котором говорится о сравнении цветов. Он предлагает для базовых сравнений цветов использовать метод .ToArgb() для цветовой структуры, поскольку == и Equals делают больше, чем просто сравнивают значение цвета.

person heavyd    schedule 30.04.2012
comment
Я не вношу никаких других изменений. Вы были правы, я хотел проверить на map_t, но даже комментирование этого теста не помогает. Итак, чего мне не хватает, если я хочу изменить map, а затем нарисовать эти измененные изображения? Закомментированная строка map.SetPixel(...) вместо предыдущей не помогает, и это для меня загадка. Кроме того, этот код очень похож на то, что я уже нашел, но не было кода именно того, что мне нужно, поэтому мне пришлось его изменить - видимо, неправильно... - person wasyl; 01.05.2012
comment
Я не думаю, что ваша проблема заключается в обновлении поля изображения, то, что вы делаете, должно обновить поле (см. простой пример: gist.github.com/2563600). Ваше утверждение if не позволяет вам когда-либо менять изображение. - person heavyd; 01.05.2012
comment
Большое спасибо! Тест был неправильным, но на самом деле моя проблема заключалась в том, что MapForm.Enabled было установлено на False! И из-за этого событие MouseMove вообще не будет вызываться ... Вы помогли мне найти его, сказав, что это должно работать - и это работает (в обоих направлениях, map.SetPixel и canvas.DrawLine. Я, вероятно, буду делать это некоторое время. Еще раз спасибо! :) - person wasyl; 01.05.2012