gpt4 book ai didi

c# - C# 中的高效图像处理

转载 作者:可可西里 更新时间:2023-11-01 08:46:34 25 4
gpt4 key购买 nike

我正在使用 System.Drawing 类从用户上传的照片中生成缩略图和带水印的图像。用户还可以在上传原件后使用 jCrop 裁剪图像。我已经从其他人那里接管了这段代码,并希望对其进行简化和优化(它正在一个高流量网站上使用)。

前一个人有静态方法接收位图作为参数并返回一个位图,在内部分配和处理 Graphics 对象。我的理解是 Bitmap 实例包含内存中的整个图像,而 Graphics 基本上是一个绘制操作队列,并且它是幂等的。

目前流程如下:

  • 接收图像并将其存储在临时文件中。
  • 接收裁剪坐标。
  • 将原始位图加载到内存中。
  • 从原始位图创建一个新位图,应用裁剪。
  • 对新位图做一些疯狂的亮度调整,也许(?)返回一个新位图(我宁愿不碰这个;指针算法比比皆是!),我们称之为 A。
  • 根据生成的位图创建另一个位图,应用水印(我们称之为 B1)
  • 从 A 创建一个 175x175 的缩略图位图。
  • 从 A 创建一个 45x45 缩略图位图。

这看起来像是很多内存分配;我的问题是:重写部分代码并重用 Graphics 实例,实际上创建一个管道是个好主意吗?实际上,我只需要 1 张图像在内存中(原始上传),而其余的可以直接写入磁盘。所有生成的图像都需要裁剪和亮度变换,以及该版本独有的单一变换,有效地创建一个操作树。

有什么想法或想法吗?

哦,我应该提一下,这是我第一次真正使用 .NET,所以如果我说的话看起来很困惑,请耐心等待并给我一些提示。

最佳答案

重复使用 Graphics 对象可能不会带来显着的性能提升。

底层 GDI 代码简单地为您在 RAM(内存 DC)中加载的位图创 build 备上下文。

您的操作瓶颈似乎在于从磁盘加载图像。

为什么要从磁盘重新加载图像?如果它已经在 RAM 中的字节数组中,上传时应该是这样 - 您可以只在字节数组上创建一个内存流,然后从该内存流创建一个位图。

换句话说,将它保存到磁盘,但不要重新加载它,只是从 RAM 中对其进行操作。

此外,您不需要创建新的位图来应用水印(取决于它是如何完成的。)

您应该对操作进行概要分析以查看需要改进的地方(或者即使需要改进。)

关于c# - C# 中的高效图像处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/921557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com