【问题标题】:c# cut image in specific size in memory without save filec#在内存中以特定大小剪切图像而不保存文件
【发布时间】:2017-03-28 11:54:05
【问题描述】:

我有这样的感冒:

 Bitmap bmp = new Bitmap(width, height);

我只是捕捉窗口。现在我只想调整这个捕获的位图(bmp)。 例如,我怎样才能削减我的 bmp

  RECT rt = new RECT();
        GetWindowRect(hwnd1, out rt);
        Int32 width = rt.Right - rt.Left;
        Int32 height = rt.Bottom - rt.Top;
        int leftttt = rt.Left + (width - 202);
        int width2 = rt.Right - leftttt;

//              // I want cut like this :
//
      //  in x=lefttt  y = rt.Top    Size ( width2,height)

稍后我可以通过以下方式轻松保存文件以检查我的结果:(但不会仅用于检查)

    bmp.Save(@"D:\test.jpg", ImageFormat.Jpeg);

编辑:我只想剪切而不是调整大小。 当我做代码时:

var graph = Graphics.FromImage(scren_kurwa.Image);

graph.DrawImage(bmp.Image, 10, 10, 200, 200);

我保存它只是覆盖我的 bmp 屏幕,只是在较小的版本中捕获。

我只想剪切,例如我只想显示此屏幕宽度的 1/4 并将其保存到文件中。 (只需节省 1/4 宽度即可)。

编辑 2:

graph.CopyFromScreen(leftttt, rt.Top, 0, 0, new Size(width2, height), CopyPixelOperation.SourceCopy);

上面的这段代码只是做我想做的,但我不想再从屏幕复制我想从之前捕获的 bmp 复制这个。

新手请耐心等待。我搜索了论坛,只是找不到解决方案。 谢谢。

编辑 3 我只是按照你写的那样做:

        Rectangle cropRect = new Rectangle(100,100,100,100);
        Bitmap bmp1 = new Bitmap(bmp1.Image);
        bmp1.Clone(cropRect, bmp.PixelFormat);


        bmp1.Save(@"D:\xdddde.jpg", ImageFormat.Jpeg);

但它不会剪切图像,只是显示与我的 bmp 相同。

【问题讨论】:

标签: c# bitmap cut


【解决方案1】:

这应该适合你:

Bitmap cuttedImage;

using(Bitmap originalImage = new Bitmap("filePathName"))
{
   Rectangle cropRect = new Rectangle(...);

   cuttedImage = originalImage .Clone(cropRect, originalBmp.PixelFormat);
}

cuttedImage.Save("filePathName", ImageFormat.Jpeg);
cuttedImage.Dispose();

请注意,这将创建 Bitmap 的浅表副本。在您的情况下,这似乎不是问题,但请记住这一点。

还要确保检查MSDN documentation 以进行异常处理。要么事先检查矩形是否大于 0 且不大于原始图像,要么捕获异常。

【讨论】:

  • 矩形太大我的意思也是“越界”。即使您的矩形比图像小,如果您指定原始图像范围之外的区域,您也会得到OutOfMemory 异常。例如:在 100x100 的图像上,如果你想将矩形放置在 (45, 40) 到 (100,100) 之间,你需要做new Rectangle(45, 40, 55, 90)。因为:宽度 = 图片宽度 - x = (100 - 45 = 55),高度 = 图片高度 - y = (100 - 40 = 60)。 new Rectangle(45, 40, 100, 100) 会给你一个 OutOfMemory 异常:矩形放置在 (45, 40) 到 (145, 140) 之间 -> 比你的图像大!
  • 是的,谢谢你,我知道我刚刚测试了我现在知道ourofmemory。但是看看我的主要编辑,我刚刚写了 EDIT 3
  • @Michael 我刚刚稍微更新了代码。这应该更强大,希望也对您有用。
  • 顺便说一句,我应该用这个克隆清理内存或其他东西吗?因为我尝试再次启动并启动项目,所以我弹出你没有运行项目的内存。
  • 是的,你应该这样做。我直接更新了我的答案,向您展示了我将如何实现它(代码的作用相同,但现在处理处置)。 using 语句将确保 originalImage 被释放。然后我以cuttedImage 上的Dispose() 方法结束,以确保也处理了这个方法。这种方法的好处是,您现在甚至可以保存到与原始资源释放后相同的文件位置(覆盖文件)。
猜你喜欢
  • 2013-06-20
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 2021-01-20
相关资源
最近更新 更多