【问题标题】:crop image without copying裁剪图像而不复制
【发布时间】:2013-03-26 22:12:11
【问题描述】:

我正在编写一个应用程序,需要我将大图像分割成小图块,其中每个图块本质上是原始图像的裁剪版本。

目前我的拆分操作看起来像这样

tile.Image = new BitmapImage();
tile.Image.BeginInit();
tile.Image.UriSource = OriginalImage.UriSource;
tile.Image.SourceRect = new Int32Rect(x * tileWidth + x, y * tileHeight, tileWidth, tileHeight);
tile.Image.EndInit();

直观地说,我认为这基本上会创建对原始图像的“参考”,并且只会显示为图像的子矩形。然而,我的分割操作执行速度很慢,让我相信这实际上是在复制原始图像的源矩形,这对于大图像来说非常慢(分割一个像样的图像时会有明显的 3-4 秒停顿)大小图像)。

我环顾四周,但无法找到一种方法来将位图绘制为大图像的子矩形,而无需复制任何数据。有什么建议吗?

【问题讨论】:

  • 您是否尝试过创建一个新的Bitmap 并插入它?我认为这可能比尝试内联裁剪图像更快。
  • 您的tile 类可以存储对原始图像的引用和绘制自身时要复制的矩形? Graphics.DrawImage 有重载来绘制位图的一部分:msdn.microsoft.com/en-us/library/3tf158xz.aspx
  • 诚然,我不是图像处理方面的专家,但我不确定您的要求是否合理。虽然可能存在隐藏副本的机制,但我怀疑图像数据需要在内存中“重新对齐”(复制)。
  • 澄清我的最后一条评论,我只是在考虑内部存储格式——它可能只是一个字节数组。简化很多,例如,4x4 图像在内存中是 ABCD EFGH IJKL MNOP。例如,如果您想要左上角的 2x2,您需要一个新的字节数组,例如 ABEF。它不是子数组。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: c# performance crop bitmapimage


【解决方案1】:

使用 System.Windows.Media.Imaging.CroppedBitmap 类:

// Create a CroppedBitmap from the original image.
Int32Rect rect = new Int32Rect(x * tileWidth + x, y * tileHeight, tileWidth, tileHeight);
CroppedBitmap croppedBitmap = new CroppedBitmap(originalImage, rect);

// Create an Image element.
Image tileImage = new Image();
tileImage.Width = tileWidth;
tileImage.Height = tileHeight;
tileImage.Source = croppedBitmap;

【讨论】:

  • 之前我评论说这并没有提高性能,但我只是再次尝试了旧方法,这确实产生了显着的性能提升(从接近 6 秒的拆分到更像1 秒)。
猜你喜欢
  • 2015-08-23
  • 2011-07-14
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2011-02-07
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多