我想将图片框和图片一起缩放。
这将缩放唯一的图像部分而不是图形部分。
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());
图片正在缩放,但是当我们在图像外部绘制矩形时,它不会随图像一起缩放。
见图:
答案 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
将其移动到正确的位置..