如何重新调整图像的大小C#.net Windows窗体
我想知道,一旦我将一个图像加载到windows窗体中,是否有一种方法允许用户拖动该图像的角并重新调整其大小 目前,我知道PictureBox.Scale方法(但不推荐使用)。我还知道PictureBox.Image.Size。这是否意味着每次它们重新调整大小时,我都需要使用PictureBox.Image.size?另外,我如何允许他们抓取图像以重新调整大小?我想我正在考虑绘画,以及它如何允许用户选择图像,然后通过拖动角来重新调整大小 我不是在寻找一个完整的解决方案——只是一些指向正确方向的指针(伪代码或帮助我思考过程的一般描述就可以了)。我不太清楚如何处理这个问题 以下是我目前的代码:如何重新调整图像的大小C#.net Windows窗体,c#,.net,winforms,C#,.net,Winforms,我想知道,一旦我将一个图像加载到windows窗体中,是否有一种方法允许用户拖动该图像的角并重新调整其大小 目前,我知道PictureBox.Scale方法(但不推荐使用)。我还知道PictureBox.Image.Size。这是否意味着每次它们重新调整大小时,我都需要使用PictureBox.Image.size?另外,我如何允许他们抓取图像以重新调整大小?我想我正在考虑绘画,以及它如何允许用户选择图像,然后通过拖动角来重新调整大小 我不是在寻找一个完整的解决方案——只是一些指向正确方向的指针
using (OpenFileDialog ofd = new OpenFileDialog())
{
ofd.Title = "Load Image";
if (ofd.ShowDialog() == DialogResult.OK)
{
PictureBox pictureBox = new PictureBox();
pictureBox.Image = new Bitmap(ofd.FileName);
pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox.Size = pictureBox.Image.Size;
panelArea.Controls.Add(pictureBox);
}
}
公共位图\u当前位图;
公共空间大小调整(int-newWidth、int-newHeight)
{
if(newWidth!=0&&newHeight!=0)
{
位图温度=(位图)\u当前位图;
位图bmap=新位图(新宽度、新高度、临时像素格式);
双nWidthFactor=(双)临时宽度/(双)新宽度;
双N权重系数=(双)温度高度/(双)新高度;
纽约州纽约州财政部双倍外汇;
int-cx,cy,fr_x,fr_y;
颜色1=新颜色();
颜色2=新颜色();
Color color3=新颜色();
Color color4=新颜色();
字节nRed、nGreen、nBlue;
字节bp1,bp2;
对于(int x=0;x=温度宽度)cx=fr\ux;
cy=fr_y+1;
如果(cy>=温度高度)cy=fr\u y;
fx=x*nWidthFactor-fr_x;
fy=y*n权重因子-fr_y;
nx=1.0-fx;
ny=1.0-fy;
color1=温度获取像素(fr_x,fr_y);
color2=温度获取像素(cx,fr_y);
color3=温度获取像素(fr_x,cy);
color4=温度获取像素(cx,cy);
//蓝色的
bp1=(字节)(nx*color1.B+fx*color2.B);
bp2=(字节)(nx*color3.B+fx*color4.B);
nBlue=(字节)(ny*(双字节)(bp1)+fy*(双字节)(bp2));
//绿色的
bp1=(字节)(nx*color1.G+fx*color2.G);
bp2=(字节)(nx*color3.G+fx*color4.G);
nGreen=(字节)(ny*(双字节)(bp1)+fy*(双字节)(bp2));
//红色的
bp1=(字节)(nx*color1.R+fx*color2.R);
bp2=(字节)(nx*color3.R+fx*color4.R);
nRed=(字节)(ny*(双字节)(bp1)+fy*(双字节)(bp2));
bmap.SetPixel(x,y,System.Drawing.Color.FromArgb(255,nRed,nGreen,nBlue));
}
}
_currentBitmap=(位图)bmap.Clone();
}
}
编辑:在您的情况下,Hans Passant的方法是最好的。我会保持我的答案,以防您最终有更复杂的编辑需求(例如,拖动多个形状)
有趣的部分是让鼠标交互工作。现在,假设您只想通过拖动图像的右下角来调整大小。我会这样做:
ImageCanvas
。在此控件内,执行以下操作:Rectangle imageRect
OnPaint
方法以显示图像:
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawImage(image, imageRect);
}
bool isdragingsize
OnMouseDown
和onmousedup
。当鼠标按钮分别向下或向上移动时,设置或清除isDragingSize
- 设置光标:如果
或鼠标指针靠近图像的右下角,则设置isDragingSize
;否则,设置cursor=Cursors.SizeNWSE
Cursor=Cursors.Default
- 如果
,请根据鼠标位置更改isDragingSize
字段。必要时调用imageSize
,或Invalidate()
,以更新显示Refresh()
Winforms中已经有一个控件可以显示位图并支持使用鼠标调整大小:窗体。你只需要做一点手术就可以控制它:
using (OpenFileDialog ofd = new OpenFileDialog()) {
ofd.Title = "Load Image";
if (ofd.ShowDialog() == DialogResult.OK) {
var box = new Form();
box.TopLevel = box.ControlBox = false;
box.Visible = true;
box.BackgroundImage = new Bitmap(ofd.FileName);
panelArea.Controls.Add(box);
box.Size = box.BackgroundImage.Size;
}
}
谢谢贾斯汀,你的解决方案仍然非常有用-很高兴你留下了它。再次感谢!
using (OpenFileDialog ofd = new OpenFileDialog()) {
ofd.Title = "Load Image";
if (ofd.ShowDialog() == DialogResult.OK) {
var box = new Form();
box.TopLevel = box.ControlBox = false;
box.Visible = true;
box.BackgroundImage = new Bitmap(ofd.FileName);
panelArea.Controls.Add(box);
box.Size = box.BackgroundImage.Size;
}
}