c# - 在两个图像之间转换的最有效方法是什么(如 Mac 墙纸更改)

标签 c# algorithm image-processing

我正在开发壁纸应用程序。墙纸根据用户的指定每隔几分钟更换一次。

我想要的功能是在淡出旧图像的同时淡入新图像。如果每 X 分钟更换一次墙纸,任何拥有 Mac 的人都可能会看到我想要的行为。

我目前关于如何处理这个问题的想法是拍摄两张图片并将一张叠加在另一张上并改变不透明度。旧图像从 90% 开始,新图像从 10% 开始。然后我会将旧图像减少 10% 直到它是 0%,同时将新图像增加 10% 直到 90%。然后我会将墙纸设置为新图像。

为了让它看起来像一个平滑的过渡,我会在开始这个过程之前创建过渡壁纸,而不是实时进行。

我的问题是,是否有更有效的方法来做到这一点?

我可以想到一些优化,例如以较低质量保存过渡图像。

有什么方法可以比我描述的更有效吗?

最佳答案

听起来像是一个权衡问题。

这取决于重点:

  • 渲染速度
  • 资源的使用

渲染速度将成为一个问题,即混合图像的过程需要多长时间才能渲染成屏幕可绘制图像。如果混合过程花费的时间太长(因为与常规不透明绘制操作相比,透明效果可能需要很长时间),那么预渲染过渡可能是一个不错的方法。

当然,预渲染意味着内存或磁盘存储中将有多个图像必须保留。这将意味着将需要更多资源来临时存储过渡效果。如果资源稀缺,那么即时进行转换可能更可取。此外,如果图像在磁盘上,由于主内存之外的数据 I/O 速度较慢,性能将会受到影响。

关于“以较低质量保存过渡图像”的问题——“较低质量”是什么意思?你的意思是压缩图像?或者,你的意思是图像较小?我可以看出每种方法的优缺点。

  • 压缩图片

    • 优点:每张图片消耗的内存量会更少。这将需要更少的磁盘空间或内存空间。
    • 缺点图像的解压缩需要处理。解压缩的图像在被绘制到屏幕之前将在内存中占用额外的空间。如果使用 JPEG 等有损压缩,则可能会看到压缩伪影。
  • 使用较小的图片

    • 优点:同样,每张图像所用的内存量会更少。
    • 缺点:将图像拉伸(stretch)到屏幕尺寸的过程需要一些处理能力。同样,需要额外的内存来生成拉伸(stretch)图像。

最后,有一点需要考虑——实时渲染过渡真的不够快吗?

实际上渲染可能不会花费太长时间,而这可能全部都是premature optimization。 .

在没有任何优化的情况下制作原型(prototype)可能值得一试,看看是否真的有必要预渲染过渡。 Profile流程的每个步骤,以查看哪些内容需要时间。

如果即时渲染的性能不尽如人意,请权衡每种预渲染方法的优缺点,然后选择效果最好的一种。

关于c# - 在两个图像之间转换的最有效方法是什么(如 Mac 墙纸更改),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/792050/

相关文章:

c# - 当你将一个参数传递给下一个参数时你怎么调用它

algorithm - 从顶点覆盖减少以证明 NP 完全

algorithm - 反序列化序列化整体的部分;反序列化对象内容而不反序列化整个对象

python - 使用opencv和python计算相机到物体的距离

c++ - 在 C++ 中调整卷文件的长度和宽度

c# - 如何注销 session MVC Razor visual studio

c# - 使用 Entity Framework 从 Id 列表中删除多个项目

c# - 使用 EF Core Include 连接 ExpressionVisitor

algorithm - 是否有将 2D 视频转换为 3D 视频的算法?

python - 为什么有些图像有第三维,而其他图像有 4?