Picturebox缩放适用于预加载的图像但不适用于图形(C#/ Winforms)

时间:2016-04-28 18:04:26

标签: c# image winforms

我有一个图片框,我希望我的winform用户能够通过缩放和拖动图像进行交互。现在这个表格看起来像这个

enter image description here

我实现了拖放和缩放方法。那些看起来像这样。

private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
{
    // If the mouse wheel is moved forward (Zoom in)
    if (e.Delta > 0)
    {
        // Change the size of the picturebox, multiply it by the ZOOMFACTOR
        pictureBox1.Width = (int)(pictureBox1.Width * 1.25);
        pictureBox1.Height = (int)(pictureBox1.Height * 1.25);

        // Formula to move the picturebox, to zoom in the point selected by the mouse cursor
        pictureBox1.Top = (int)(e.Y - 1.25 * (e.Y - pictureBox1.Top));
        pictureBox1.Left = (int)(e.X - 1.25 * (e.X - pictureBox1.Left));
    }
    else
    {
        pictureBox1.Width = (int)(pictureBox1.Width / 1.25);
        pictureBox1.Height = (int)(pictureBox1.Height / 1.25);

        // Formula to move the picturebox, to zoom in the point selected by the mouse cursor
        pictureBox1.Top = (int)(e.Y - 0.80 * (e.Y - pictureBox1.Top));
        pictureBox1.Left = (int)(e.X - 0.80 * (e.X - pictureBox1.Left));
    }
}


private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    dragging = false;
    Console.WriteLine("Dragging: false");
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        dragging = true;
        xDrag = e.X;
        yDrag = e.Y;
        Console.WriteLine("Dragging: true");
    }
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    Control c = sender as Control;
    if (dragging && c != null)
    {
        c.Top = e.Y + c.Top - yDrag;
        c.Left = e.X + c.Left - xDrag;
        Console.WriteLine(e.Location.ToString());
    }
}

拖动工作正常,但缩放不能按预期工作。而不是放大它而是向上和向左推动图像,因为我放大"

enter image description here

出于好奇,我加载了一个我保存在Google上的位图来测试缩放,它可以很好地处理来自文件的位图图像;它只是不能处理用Graphics对象绘制的图像,我不知道为什么。任何帮助将不胜感激。

绘制图片框的事件代码

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    RunEntry entry = this.passedHistory.SelectedItem as RunEntry;
    if (entry == null)
    {
        return;
    }
    else if(entry.FileRead != null && checkBox1.Checked) //If ANS is selected and show all, get TRE
    {
        foreach(RunEntry r in passedHistory.Items)
        {
            if (r.TreComponentRead != null)
            {
                string ansName = Path.GetFileNameWithoutExtension(entry.FileName);
                string treName = Path.GetFileNameWithoutExtension(r.FileName);
                if(ansName.Equals(treName, StringComparison.OrdinalIgnoreCase))
                {
                    entry.TreComponentRead = r.TreComponentRead;
                }
            }
        }
    }
    if (isDraw && entry.FileRead != null)
    {
        //Preparing to draw
        Graphics g = e.Graphics;
        g.ScaleTransform(2f, 2f);
        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.InterpolationMode = InterpolationMode.Bicubic;
        AnsFile objToDraw = entry.FileRead;
        Pen pen = new Pen(Color.Black);

        //Getting size of bitmap
        int maxWidth = 0, maxHeight = 0;
        foreach (AnsJoint joint in objToDraw.AnsJoints)
        {
            if (joint.Location.X.Length > maxWidth)
            {
                maxWidth = (int)joint.Location.X.Length;
            }
            if (joint.Location.Y.Length > maxHeight)
            {
                maxHeight = (int)joint.Location.Y.Length;
            }
        }

        //Drawing joints //TODO: (Trello: Improve math behind visualizer)
        foreach (AnsJoint joint in objToDraw.AnsJoints)
        {
            PointF jointPoint = this.ToCartesian(new PointF((float)joint.Location.X.Length - 4f, (float)joint.Location.Y.Length + 10f), maxHeight);
            e.Graphics.DrawString(joint.JointID.ToString(), new Font(FontFamily.GenericMonospace, 6f, FontStyle.Regular, GraphicsUnit.Point, 1, false), Brushes.Black, jointPoint);
        }

        //Draw the panels and links //TODO: (Trello: Improve math behind visualizer)
        foreach (AnsMember member in objToDraw.AnsMembers)
        {
            List<AnsPanel> panels = member.Panels; //Drawing the panels

            foreach (AnsPanel pan in panels)
            {
                pen.Color = Color.Red;
                PointF p1 = this.ToCartesian(new PointF((float)pan.I.Location.X.Length, (float)pan.I.Location.Y.Length), maxHeight);
                PointF p2 = this.ToCartesian(new PointF((float)pan.J.Location.X.Length, (float)pan.J.Location.Y.Length), maxHeight);

                g.DrawEllipse(pen, p1.X - 2.5f, p1.Y - 2.5f, 5, 5);
                g.DrawEllipse(pen, p2.X - 2.5f, p2.Y - 2.5f, 5, 5);

                g.DrawEllipse(pen, p1.X - 3, p1.Y - 3.3f, 5, 5);
                g.DrawEllipse(pen, p2.X - 3, p2.Y - 3.3f, 5, 5);
                pen.Color = Color.Black;
                g.DrawLine(pen, p1, p2);
            }
            List<AnsLink> links = member.Links; //Drawing the links
            foreach (AnsLink link in links)
            {
                PointF p1 = this.ToCartesian(new PointF((float)link.I.Location.X.Length, (float)link.I.Location.Y.Length), maxHeight);
                PointF p2 = this.ToCartesian(new PointF((float)link.J.Location.X.Length, (float)link.J.Location.Y.Length), maxHeight);
                g.FillEllipse(Brushes.Green, p1.X - 1.5f, p1.Y - 1.5f, 3, 3);
                g.FillEllipse(Brushes.Green, p2.X - 1.5f, p2.Y - 1.5f, 3, 3);
                g.DrawLine(pen, p1, p2);
            }
        }
        pictureBox1.Tag = entry.FileName;
    }
    if (isDraw && entry.TreComponentRead != null)
    {
        //Preparing to draw
        Graphics g = e.Graphics;
        g.ScaleTransform(2f, 2f);
        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.InterpolationMode = InterpolationMode.Bicubic;
        TreComponent objToDraw = entry.TreComponentRead;
        Pen pen = new Pen(Color.Black);

        int maxWidth = 0, maxHeight = 0;
        foreach (Member member in objToDraw.Members)
        {
            foreach (GeometryClassLibrary.Point p in member.Geometry.Vertices)
            {
                if (p.X.Inches > maxWidth)
                {
                    maxWidth = (int)p.X.Inches;
                }
                if (p.Y.Inches > maxHeight)
                {
                    maxHeight = (int)p.Y.Inches;
                }
            }
        }
        maxHeight += 5; maxWidth += 5;
        maxHeight += 15; maxWidth += 5;

        foreach (Member member in objToDraw.Members)
        {
            List<PointF> pointsToDraw = new List<PointF>();
            foreach (GeometryClassLibrary.Point p in member.Geometry.Vertices)
            {
                pointsToDraw.Add(ToCartesian(new PointF((float)p.X.Inches, (float)p.Y.Inches), maxHeight));
                PointF pointToDraw = this.ToCartesian(new PointF((float)p.X.Inches, (float)p.Y.Inches), maxHeight);
                g.FillEllipse(Brushes.Red, pointToDraw.X - 1.5f, pointToDraw.Y - 1.5f, 3, 3);
                pointsToDraw.Add(pointToDraw);
            }
            g.DrawPolygon(pen, pointsToDraw.ToArray());
            //Getting center of member and labeling member
            float totalX = 0, totalY = 0;
            foreach (PointF p in pointsToDraw)
            {
                totalX += p.X;
                totalY += p.Y;
            }
            float centerX = totalX / pointsToDraw.Count;
            float centerY = totalY / pointsToDraw.Count - 10;
            PointF midPoint = new PointF(centerX, centerY);
            g.DrawString(member.Name, new Font(FontFamily.GenericMonospace, 6f, FontStyle.Regular, GraphicsUnit.Point, 1, false), Brushes.Black, midPoint);
        }
        pictureBox1.Tag = entry.FileName;
    }
}

0 个答案:

没有答案