Bitmap.GetPixel () ничего не возвращает - PullRequest
2 голосов
/ 01 ноября 2011

Как видно из названия, вызов Bitmap.GetPixel ничего не дает. Переменной не присваивается значение, исключение не выдается.

Вот мой тестовый код:

private void frmStatTracker_Load(object sender, EventArgs e)
    {
        ScreenCapture sc = new ScreenCapture();
        Color charlie = new Color();
        foreach (Process p in Process.GetProcesses())
        {
            if (p.MainWindowTitle.Contains("DM -"))
            {
                sc.CaptureWindowToFile(p.MainWindowHandle, "C:\\test.png", System.Drawing.Imaging.ImageFormat.Png);
                Image i = sc.CaptureWindow(p.MainWindowHandle);
                Bitmap b = new Bitmap(i);
                pictureBox1.Image = b;

                charlie = b.GetPixel(65, 41);
                return;
            }
        }
    }

Когда я ставлю точку останова, я получаю следующее:

у меня есть действительное изображение из screenCapture.

b содержит действительное изображение.

Чарли остался без значения. Когда я добавляю его в список наблюдения, он говорит мне, что Чарли не существует в текущем контексте, а переменная не существует в окне Locals. Если я установлю точку останова либо в объявлении, либо в строке, в которой оно присваивает значение, точка останова будет нажата и, похоже, будет запущена.

Я сошел с ума, и понятия не имею, как даже начать устранять неполадки в чем-то подобном. Помощь

Спасибо: -)

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Как только вы напишите какой-нибудь код, который на самом деле что-то делает с charlie, компилятор перестанет его оптимизировать.

Например, если у вас есть функция с именем snort(Color color), тогда пишется:

charlie = b.GetPixel(65, 41);
snort(charlie);

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

Конечно, вы, вероятно, отлаживаете сборку релиза с включенной оптимизацией.Вам следует изменить настройки проекта, чтобы при сборке для отладки оптимизации были отключены.Когда вы сделаете это, вам не придется прибегать к хитростям, чтобы победить оптимизатор.Или, возможно, вы просто отлаживаете сборку релиза - у вас есть идея, которой я доверяю.

3 голосов
/ 01 ноября 2011

Вы отлаживаете выпуск (или другую оптимизированную) сборку. Вот почему charlie не существует. Переменная была только назначена, не используется иначе. Компилятор оптимизировал его.

РЕДАКТИРОВАТЬ: Вы можете предотвратить это, используя сборку Debug или, как сказал Дэвид Хеффернан, делая что-то значимое с charlie.

...