Не могу нарисовать на растровом изображении - PullRequest
1 голос
/ 24 мая 2011

Я использую PictureEdit (элемент управления DevExpress) как дочерний элемент какой-либо формы.И я пытаюсь нарисовать пиксель на загруженном изображении, используя MouseEventArgs свойства координат.

private void PictureEditorOnMouseMove(Object sender, MouseEventArgs e)
{            
    if(e.Button == MouseButtons.Left)
    {
        (this.pictureEditor.Image as Bitmap).SetPixel(e.X, e.Y, this.colorPicker.Color);                                    
    }
}

ArgumentOutOfRangeException говорит, что параметр x (или y), переданный методу SetPixel, не является положительным&& больше свойства Height данного растрового изображения.Я думал, что я использую координаты, связанные bitmap.Width и bitmap.Height.

Как их связать?Или что я делаю не так?

Спасибо!

1 Ответ

0 голосов
/ 15 ноября 2013

Попробуйте это:

private void PictureEditorOnMouseMove(Object sender, MouseEventArgs e)
{   
    if(e.Button == MouseButtons.Left)
    {
        PictureEdit pce = sender as PictureEdit;
        Bitmap bmpImage = pce.Image as Bitmap;
        PictureEditViewInfo viewInfo = pce.GetViewInfo() as PictureEditViewInfo;

        var p = new Point(
            (e.Location.X - viewInfo.PictureStartX) * bmpImage.Width / viewInfo.PictureRect.Width,
            (e.Location.Y - viewInfo.PictureStartY) * bmpImage.Height / viewInfo.PictureRect.Height);

        if (p.X >= 0 && p.X < bmpImage.Width && p.Y >= 0 && p.Y < bmpImage.Height)
        {
            bmpImage.SetPixel(p.X, p.Y, this.colorPicker.Color);
        }
        else
        {
            Console.WriteLine("Out bounds");
        }
    }
}

Обратите внимание, что вам нужно перевести местоположение мыши в приблизительное положение пикселя растрового изображения с учетом SizeMode в PictureEdit. Это делается при создании новой точки в примере кода.

...