【发布时间】:2009-12-18 16:07:18
【问题描述】:
我目前的困境如下:
我有一个 2550x3300 的 tiff。在我的 tiff 中的某些(可变)点,我需要从 tiff 的其他地方插入一行像素。例如我需要在第 500 行和第 501 行之间的第 100 行的一行中插入 12 个副本。
我这几天一直在寻找不同的图像处理技术,但找不到其他人在做这种事情,这让我相信我可能走错了路。
或者,如果我正在做的事情非常缓慢并且没有更好的方法来做到这一点,那么最快的方法是什么?使用 GDI+ 大约需要 12 秒来添加 1330 行,如果我使用“不安全”(我现在正在 C# 中执行所有这些操作)则需要 7.7 秒,如果我使用 FreeImage dll,我可以将其缩短到大约 2.5 秒。
提前致谢。
【问题讨论】:
-
在不进行任何图像修改的情况下,仅读取图像并将其写回需要多长时间?这可能是瓶颈。
-
我很确定这不是瓶颈,但在我写完这篇文章后,我会仔细检查。我在 GDI+ 上将插入过程计时为 10-11 秒。我还没有考虑对 FreeImage 中的各个部分进行计时。我现在就试试。
-
是否需要将每次插入都写入磁盘,或者可以延迟磁盘写入以便在写入之前进行多次插入?如果是这样,可能不会为数据保留连续内存,但某种链表方法可能会起作用。写入磁盘时(可能)会降低速度,但如果您不必每次执行插入时都敲击磁盘,这可能会使其整体速度更快。
-
这可能是压缩问题吗? Tiff 是压缩的,所以你可以在每次插入一行后解压缩然后重新压缩。也许尝试转换为原始字节,然后插入新行并转换回 tiff。另请记住,您正在进行大约 13 MB 的复制,每行 2500 像素 * 每像素 4 字节 * 1100 行。
-
我写入磁盘的唯一时间是所有处理完成后,所以我相当肯定这不是最大的问题。另外,我不认为压缩是一个问题,尽管我承认我没有仔细检查过。在我对它做任何事情之前,我正在将文件从内存流转换为 Bitmap 对象,所以我想它不会像这样在内存中保持压缩。不过我会调查一下。
标签: .net performance data-structures image-processing