当前位置: 代码迷 >> C# >> C# GDI+截图,截的图片区域准确,但没有铺满整个新图的大小
  详细解决方案

C# GDI+截图,截的图片区域准确,但没有铺满整个新图的大小

热度:711   发布时间:2016-05-05 03:21:55.0
C# GDI+截图,截的图片区域正确,但没有铺满整个新图的大小
需求: 我想截原图中的鞋子,如下面新图上的部分。想让新图上的鞋子铺满整个新图区域,盖住灰色部分。
问题: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);
改成这样?
  相关解决方案