//缩放图像
private void ScaleBitmap(string imgUrl)
{
//源图像
System.Drawing.Bitmap oldBmp = new System.Drawing.Bitmap(imgUrl);
//新图像,并设置新图像的宽高
System.Drawing.Bitmap newBmp = new System.Drawing.Bitmap(100, 100);
Graphics draw = Graphics.FromImage(newBmp);//从新图像获取对应的Graphics
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, 50, 50);//指定绘制新图像的位置和大小
draw.DrawImage(oldBmp, rect);//把源图像的全部完整的内容,绘制到新图像rect这个区域内,这不就实现缩放了么
draw.Dispose();
oldBmp.Dispose();//一定要把源图Dispose调,因为保存的是相同路径,需要把之前的图顶替调,如果不释放的话会报错:(GDI+ 中发生一般性错误。)
newBmp.Save(imgUrl);//保存替换到同一个路径
}
//裁剪图像
private void CutBitmap(string imgUrl)
{
System.Drawing.Bitmap oldBmp = new System.Drawing.Bitmap(imgUrl);
//新图像,并设置宽高
System.Drawing.Bitmap newBmp = new System.Drawing.Bitmap(100, 100);
Graphics draw = Graphics.FromImage(newBmp);
draw.DrawImage(oldBmp, 50, 50);//指定目标图像从(x,y)坐标开始绘制
draw.Dispose();
oldBmp.Dispose();//一定要把源图Dispose调,因为保存的是相同路径,需要把之前的图顶替调,如果不释放的话会报错:(GDI+ 中发生一般性错误。)
newBmp.Save(imgUrl);
}
Bitmap转换为byte[]
public static byte[] BitmapToBytes(Bitmap bitmap)
{
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] buffer = ms.ToArray();
ms.Close();
ms.Dispose();
return buffer;
}
byte[]转换为Bitmap
public static Bitmap BytesToBitmap(byte[] buffer)
{
MemoryStream ms = new MemoryStream(buffer);
Bitmap bmp = new Bitmap(ms);
ms.Close();
return bmp;
}
Graphics.DrawImage 方法理解
private void btnTest_Click(object sender, RoutedEventArgs e)
{
string imgUrl = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "RemotePhoto");
//imgUrl += @"\IMG_0005.JPG";
imgUrl += @"\1.jpg";
System.Drawing.Image srcImg = System.Drawing.Image.FromFile(imgUrl);//源图像
Bitmap newBmp = new Bitmap(500,500);
Graphics draw = Graphics.FromImage(newBmp);
draw.FillRectangle(System.Drawing.Brushes.Black, 0, 0, newBmp.Width, newBmp.Height);//绘制一层黑底
//由坐标指定的位置,绘制图像的原始物理大小,如果新图的宽高小于原始图像,则仅显示新图这么大区域的图像,多余的区域不显示,相当于被裁剪掉了(裁剪)
//draw.DrawImage(srcImg, 0, 0);
//draw.DrawImage(srcImg,new System.Drawing.Point(0,0));
//draw.DrawImage(srcImg,new PointF(0.5f,0.5f));
//指定位置并且指定大小,源图像会缩放或者拉伸到指定大小(缩放)
//image 要绘制的图像
//x,y 所绘制图像的x,y
//width 所绘制图像的宽
//height 所绘制图像的高
//注意理解“要绘制”和“所绘制”的区别
//public void DrawImage(Image image,int x,int y,int width,int height)
//draw.DrawImage(srcImg, 0, 0, newBmp.Width, newBmp.Height);
//(缩放)
//image 要绘制的 Image。
//rect 指定所绘制图像的位置和大小。(就是destRect)
//public void DrawImage(Image image,Rectangle rect)
draw.DrawImage(srcImg, new Rectangle(0,0,newBmp.Width,newBmp.Height));
//指定想要绘制源图像的区域,则仅绘制这个区域,其他区域不绘制(裁剪)
//image 要绘制的 Image。
//x,y 所绘制图像的左上角的 x 坐标。所绘制图像的左上角的 y 坐标。
//srcRect 它指定 image 对象中要绘制的部分。
//srcUnit度量单位
//注意理解“要绘制”和“所绘制”的区别
//public void DrawImage(Image image,int x,int y,Rectangle srcRect,GraphicsUnit srcUnit)
//Rectangle srcRect = new Rectangle(10,10,100,100);
//draw.DrawImage(srcImg, 0, 0, srcRect, GraphicsUnit.Pixel);
//绘制平行四边形,指定绘制的三个点,第四个点会自动计算出来的(裁剪)
//System.Drawing.Point leftUpCorner = new System.Drawing.Point(10, 10);//左上角
//System.Drawing.Point rightUpCorner = new System.Drawing.Point(200, 10);//右上角
//System.Drawing.Point leftBottomCorner = new System.Drawing.Point(50, 100);//左下角
//System.Drawing.Point[] destPara = { leftUpCorner, rightUpCorner, leftBottomCorner };
//draw.DrawImage(srcImg, destPara);
//根据上面的例子,以下方法的使用就不一一举例了
//指定源图像的绘制区域,并指定一个四边形
//destPoints定义一个四变形
//srcRect定义绘制源图的区域
//srcUnit度量单位
//public void DrawImage(Image image,Point[] destPoints,Rectangle srcRect,GraphicsUnit srcUnit)
//(缩放)
//destRect目标区域
//srcX 指定源图坐标x
//srcY 指定源图u坐标y
//srcWidth 指定源图宽
//srcHeight 指定源图高
//srcUnit度量单位
//public void DrawImage(Image image,Rectangle destRect,int srcX,int srcY,int srcWidth,int srcHeight,GraphicsUnit srcUnit)
//Rectangle destRect = new Rectangle(0, 0, newBmp.Width, newBmp.Height);
//draw.DrawImage(srcImg, destRect, 0, 0, srcImg.Width, srcImg.Height, GraphicsUnit.Pixel);
//(缩放)
//destRect目标区域
//srcRect 源区域
//public void DrawImage(Image image,Rectangle destRect,Rectangle srcRect,GraphicsUnit srcUnit)
//Rectangle destRect = new Rectangle(0,0,newBmp.Width,newBmp.Height);
//Rectangle srcRect = new Rectangle(0,0,srcImg.Width,srcImg.Height);
//draw.DrawImage(srcImg, destRect, srcRect, GraphicsUnit.Pixel);
//总结
//理解“要绘制”和“所绘制”的区别
//理解"裁剪"和"缩放"的区别
BitmapImage bmpImg = BitmapToBitmapImage(newBmp);
imgPic.Source = bmpImg;
}