【问题标题】:Scaling Picturebox does not change image at all缩放 Picturebox 根本不改变图像
【发布时间】:2016-04-15 00:25:35
【问题描述】:

我正在使用图片框来创建我的桁架类实例的视觉效果。我通过直接在绘画事件中的图片框上绘制来创建视觉效果。方法是这样的

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (isDraw)
    {
        //Preparing to draw
        Graphics g = e.Graphics;
        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.InterpolationMode = InterpolationMode.Bicubic;
        RunEntry entry = this.passedHistory.SelectedItem as RunEntry;
        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
        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
        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);
            }
        }
        g.ScaleTransform(.5f, .5f);
        pictureBox1.Tag = entry.FileName;
    }
}

这会产生我期望的结果

除了我希望桁架图像可以缩放以更多地填充图片框。我将 ScaleTransform 调用添加到绘制事件方法的末尾,但这似乎没有任何影响,因为无论是否调用,图片大小相同。如何将我在图片框上绘制的内容缩放到图片框的大小?

【问题讨论】:

  • 我从来没有使用过ScaleTransform,但是这个问题的答案表明它需要在绘图调用之前设置:stackoverflow.com/questions/22615138/…(另外,看起来你的变换会缩小图形,没有。)
  • 解决了!很简单。添加它作为答案,我会接受它

标签: c# winforms graphics scaling


【解决方案1】:

在绘画之前致电ScaleTransform。您可以像这样计算所需的比例因子:

// place this code after the calculation of maxWidth and maxHeight
// but before the drawing code
PictureBox p = (PictureBox)sender;
float scaleFactor = Math.Min(
    ((float)p.Width) / maxWidth,
    ((float)p.Height) / maxHeight
);

g.ScaleTransform(scaleFactor, scaleFactor);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2016-09-04
    相关资源
    最近更新 更多