需求: 我想截原图中的鞋子,如下面新图上的部分。想让新图上的鞋子铺满整个新图区域,盖住灰色部分。
问题:C# GDI+截图,截的图片区域正确,但没有铺满整个新图的大小(748*748),新图那鞋子大小只有(241*241):
原图如下(2048 * 1365):
截的新图(748 * 748)如下,在原图上选择的区域大小(748 * 748),左上角坐标(0,0):
新图整个大小(灰色底部分)748*748 是正确的,但是图片为什么没有铺满呢?
代码如下:
/// <summary>
/// 从图片中截取部分生成新图
/// </summary>
/// <param name= "sFromFilePath "> 原始图片 </param>
/// <param name= "saveFilePath "> 生成新图 </param>
/// <param name= "width "> 截取图片宽度 </param>
/// <param name= "height "> 截取图片高度 </param>
/// <param name= "x"> 截图图片X坐标 </param>
/// <param name= "y"> 截取图片Y坐标 </param>
public static void CaptureImage(string sFromFilePath, string saveFilePath, int width, int height, int x, int y)
{
//载入底图
Image fromImage = Image.FromFile(sFromFilePath);
//创建新图位图
Bitmap bitmap = new Bitmap(width, height); // 新图的宽高 748, 748
//创建作图区域
Graphics graphic = Graphics.FromImage(bitmap);
//截取原图相应区域写入作图区
graphic.DrawImage(fromImage, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
//从作图区生成新图
Image saveImage = Image.FromHbitmap(bitmap.GetHbitmap());
//保存图象
saveImage.Save(saveFilePath, ImageFormat.Jpeg);
//释放资源
saveImage.Dispose();
bitmap.Dispose();
graphic.Dispose();
}
请熟悉C# GDI+的大神帮忙看下,不胜感激,多谢分享。
------解决思路----------------------
public static void CaptureImage(string sFromFilePath, string saveFilePath, int width, int height, int x, int y)
{
//载入底图
Image fromImage = Image.FromFile(sFromFilePath);
//创建新图位图
Bitmap bitmap = new Bitmap(width, height); // 新图的宽高 748, 748
//创建作图区域
Graphics graphic = Graphics.FromImage(bitmap);
//截取原图相应区域写入作图区
//graphic.DrawImage(fromImage, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
graphic.DrawImage(fromImage, 0, 0, width, height);
//从作图区生成新图
Image saveImage = Image.FromHbitmap(bitmap.GetHbitmap());
//保存图象
saveImage.Save(saveFilePath, ImageFormat.Jpeg);
//释放资源
saveImage.Dispose();
bitmap.Dispose();
graphic.Dispose();
}
调用另一个重载就好了 graphic.DrawImage(fromImage, 0, 0, width, height);
------解决思路----------------------
Image saveImage = Image.FromHbitmap(bitmap.GetHbitmap());这行会泄露内存。
剪裁可以用如下代码:
public static void CaptureImage(string sFromFilePath, string saveFilePath, int width, int height, int x, int y)
{
using(Bitmap bmp = new Bitmap(sFromFilePath))
using(Bitmap cropped = bmp.Clone(new Rectangle(x,y,width,height), bmp.PixelFormat))
{
cropped.Save(saveFilePath);
}
}
------解决思路----------------------
//截取原图相应区域写入作图区
graphic.DrawImage(fromImage, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
graphic.DrawImage(fromImage, x, y, new Rectangle( width, height), GraphicsUnit.Pixel);
改成这样?