如何缩放图片框和图形

时间:2015-10-08 09:03:57

标签: c# winforms graphics picturebox windows-applications

我想将图片框和图片一起缩放。

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

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());

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

见图:

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以通过缩放e.Graphics事件中的Paint对象来轻松完成此操作。请参阅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 内部 a Panel。要允许滚动,可以将Panel设置为Autocroll=true;

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

注意:

但是当你使用PictureBoxSizeMode.CenterImage时,你的问题可能毕竟不是缩放?如果您的问题确实是展示位置,而不是绘制图形的大小,则需要e.Graphics.TranslateTransform将其移动到正确的位置..