日期:2014-05-20  浏览次数:21361 次

图像框选放大和缩小(在线等)
如何实现框选图片的某个部位
然后放大或者缩小?高手指点,急用

------解决方案--------------------
框选
private GraphicsPath gp = new GraphicsPath();

MouseMove:

preview.Refresh();
gp.Reset();
gp.AddRectangle(new Rectangle(p0.X, p0.Y, Math.Abs(p0.X - p1.X), Math.Abs(p0.Y - p1.Y)));
Graphics g = preview.CreateGraphics();
Pen pen = new Pen(Color.Red, 1.0f);
g.DrawPath(pen, gp);
g.Dispose();


MouseDown:
preview.Refresh();
gp.Reset();

需要注意处理起始点和终止点的位置问题(比如,用户从右下拖到左上)


框选好以后你可以用Graphics类的DrawImage得到框选好的图像。同样还是DrawImage实现放大缩小。

//剪裁
public static Bitmap KiCut(Bitmap b, int StartX, int StartY, int iWidth, int iHeight)
{
if (b == null)
{
return null;
}

int w = b.Width;
int h = b.Height;

if (StartX > = w || StartY > = h)
{
return null;
}

if (StartX + iWidth > w)
{
iWidth = w - StartX;
}

if (StartY + iHeight > h)
{
iHeight = h - StartY;
}

Bitmap bmpOut = new Bitmap(iWidth, iHeight, PixelFormat.Format24bppRgb);

Graphics g = Graphics.FromImage(bmpOut);
g.DrawImage(b, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(StartX, StartY, iWidth, iHeight), GraphicsUnit.Pixel);
g.Dispose();

return bmpOut;
}


//重设大小
public static Bitmap KiResizeImage(Bitmap bmp, int newW, int newH)
{
try
{
Bitmap b = new Bitmap(newW, newH);
Graphics g = Graphics.FromImage(b);

//强制用效果最好的插值算法
g.InterpolationMode = InterpolationMode.HighQualityBicubic;

g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
g.Dispose();

return b;
}
catch
{
return null;
}
}


需要的话,最后再把得到的Bitmap重新画到PictureBox里。