Графика рисуется неправильно в форме окна C # - PullRequest
0 голосов
/ 11 сентября 2018

Как мне убедиться, что моя графика нарисована в правильном положении?У меня есть проект формы Windows, где пользователь рисует линии на изображении в pictureBox (в верхней части панели).Если для поля изображения установлено масштабирование по умолчанию, линии отрисовываются правильно и они правильно реагируют на растрескавшееся изображение.Однако, когда я пытаюсь нарисовать изображение при увеличении / уменьшении, положение линии смещается (вверх и влево при уменьшении, вниз и вправо при увеличении).PictureBox и панель закреплены со всех четырех сторон и не пристыкованы.Я пытался использовать метод TranslateTransform (dx, dy), но он не работал.Я также попытался избавиться от моего метода CenterBox ().Как мне продолжить?

Вот код для увеличения:

private void trackBar1_Scroll(object sender, EventArgs e)  // zoom scale
{
    zoom = (float)(0.25 + 0.25 * (trackBar1.Value - 1));
    if (trackBar1.Value > 0)
    {
        pictureBox1.Image = PictureBoxZoom(imgOriginal, new Size(trackBar1.Value, trackBar1.Value));
    }

}

public Image PictureBoxZoom(Image img, Size size) //creates zoomed in clone of user image
{
    sizeNewx = (Int32) (img.Width * zoom);
    sizeNewy = (Int32) (img.Height * zoom);
    Bitmap bm = new Bitmap(img, sizeNewx,sizeNewy);
    Graphics grap = Graphics.FromImage(bm);
    grap.InterpolationMode = InterpolationMode.HighQualityBicubic;
    CenterBox(pictureBox1, bm);
    return bm;
}

private void CenterBox(PictureBox picBox, Bitmap pic)
{
    picBox.Image = pic;
    picBox.Location = new Point((picBox.Parent.ClientSize.Width / 2) - (pic.Width / 2),
                       (picBox.Parent.ClientSize.Height / 2) - (pic.Height / 2));
    picBox.Refresh();
} 

Вот как графика рисуется и масштабируется:

private Stack<Line> lines = new Stack<Line>();

private void pictureBox1_MouseDown(object sender, MouseEventArgs e) //click in box
{
    var mouseEventArgs2 = e as MouseEventArgs;

    if (e.Button == MouseButtons.Left)
    {        
        lines.Push(new Line { Start = mouseEventArgs2.Location });
    }
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{       
    if (lines.Count > 0 && e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        lines.Peek().End = e.Location;
        pictureBox1.Invalidate();
    }
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.ScaleTransform(zoom, zoom);

    foreach (var line in lines)
    {
        Pen magenta = new Pen(Color.Magenta, 2);
        e.Graphics.DrawLine(magenta, line.Start, line.End);
    }
}

1 Ответ

0 голосов

ОК, нашел проблему. Проблема в том, что точки, которые вы получаете в mouse move и mouse end, в основном масштабируются , потому что изображение масштабируется, а затем при рисовании вы масштабируете их снова. Поэтому вам нужно отменить масштаб перед рисованием:

private void pictureBox1_MouseDown(object sender, MouseEventArgs e) //click in box
{
    var mouseEventArgs2 = e as MouseEventArgs;

    if (e.Button == MouseButtons.Left)
    {        
        Point[] pnts = new Point[ 1 ];
        Matrix scaleMatrix = new Matrix( 1 / zoom, 0, 0, 1 / zoom, 0, 0 ); //un scale
        pnts[0]= mouseEventArgs2.Location;
        scaleMatrix.TransformPoints( pnts );

        lines.Push(new Line { Start = pnts[0] });
    }
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{       
    if (lines.Count > 0 && e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        Point[] pnts = new Point[ 1 ];
        Matrix scaleMatrix = new Matrix( 1 / zoom, 0, 0, 1 / zoom, 0, 0 ); //un scale
        pnts[0]= e.Location;
        scaleMatrix.TransformPoints( pnts );

        lines.Peek().End = pnts[0];
        pictureBox1.Invalidate();
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...