【问题标题】:How to zoom picturebox along with graphics如何随图形一起缩放图片框
【发布时间】:2015-10-08 09:03:57
【问题描述】:

我想随图形一起缩放图片框。

这将缩放唯一的图像部分而不是图形部分。

public Image PictureBoxZoom(Image imgP, Size size)
{
    Bitmap bm = new Bitmap(imgP, Convert.ToInt32(imgP.Width * size.Width), Convert.ToInt32(imgP.Height * size.Height));
    Graphics grap = Graphics.FromImage(bm);
    grap.InterpolationMode = InterpolationMode.HighQualityBicubic;
    return bm;
}

private void zoomSlider_Scroll(object sender, EventArgs e)
{
    if (zoomSlider.Value > 0 && img != null)
    {
        pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
        pictureBox1.Image = null;
        pictureBox1.Image = PictureBoxZoom(img, new Size(zoomSlider.Value, zoomSlider.Value));
    }
}

图片来源:

img = Image.FromStream(openFileDialog1.OpenFile());

图片正在缩放,但是当我们在图像外部绘制矩形时,它不会随着图像一起缩放。

看图:

【问题讨论】:

标签: c# winforms graphics picturebox windows-applications


【解决方案1】:

您可以通过缩放Paint 事件中的e.Graphics 对象来轻松做到这一点(相当)。请参阅here for an example

因此,要使用您的代码,您可能应该将其添加到 Paint 事件:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
  Graphics g = e.Graphics;

  g.ScaleTransform(zoom, zoom);

  // now do your drawing..
  // here just a demo ellipse and a line..
  Rectangle rect = panel1.ClientRectangle;
  g.DrawEllipse(Pens.Firebrick, rect);
  using (Pen pen = new Pen(Color.DarkBlue, 4f)) g.DrawLine(pen, 22, 22, 88, 88);
}

要计算缩放系数,您需要进行一些计算。

通常您不会创建缩放图像,而是将工作留给带有SizeMode=Zoom 的 PictureBox。

那么你可以写:

float zoom =  1f * pictureBox1.ClientSize.Width / pictureBox1.Image.Width;

为了居中图像,通常将PictureBox 内部移动到Panel。并允许滚动将面板设置为Autocroll=true;

但由于您正在创建缩放图像,因此您应该通过其他方式跟踪当前缩放。

注意:

但是当您使用PictureBoxSizeMode.CenterImage 时,也许您的问题毕竟不在于缩放?如果您的问题确实是位置,而不是绘制图形的大小,您需要执行e.Graphics.TranslateTransform 将其移动到正确的位置..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-14
    • 2012-09-20
    • 1970-01-01
    • 2013-10-21
    • 2015-12-30
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多