C# 使用GPU(.NET)将位图转换为Jpeg

C# 使用GPU(.NET)将位图转换为Jpeg,c#,.net,image-processing,gpu,jpeg,C#,.net,Image Processing,Gpu,Jpeg,我有一个(位图)图像列表,我需要转换成Jpeg格式并保存到内存流。这就是我使用的: IEnumerable<Image> source (...) MemoryStream ms = new MemoryStream(); foreach (Image img in source) { img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); } ms.Close(); IEnumerable

我有一个(位图)图像列表,我需要转换成Jpeg格式并保存到内存流。这就是我使用的:

  IEnumerable<Image> source (...)
  MemoryStream ms = new MemoryStream();

  foreach (Image img in source)
  {
     img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
  }

  ms.Close();
IEnumerable源代码(…)
MemoryStream ms=新的MemoryStream();
foreach(源中的图像img)
{
保存(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
}
Close女士();

有没有一种方法可以减少CPU负载,并用一些GPU优化的库来代替Save方法?请提供示例代码。

想到的第一个库是

您可以使用GPU而不是CPU运行方法,只需声明一个属性:

using Cudafy;
using Cudafy.Host;
using Cudafy.Translator;

[Cudafy]
public IEnumerable<Image> SaveImages()
{
    IEnumerable<Image> source (...)
    MemoryStream ms = new MemoryStream();

    foreach (Image img in source)
    {
       img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    }

    ms.Close();

    return source;
}
使用Cudafy;
使用Cudafy.Host;
使用Cudafy.Translator;
[库达菲]
公共IEnumerable SaveImages()
{
IEnumerable源(…)
MemoryStream ms=新的MemoryStream();
foreach(源中的图像img)
{
保存(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
}
Close女士();
返回源;
}

这可能有助于提高性能。

您似乎需要专门的JPEG压缩库来取代Image.Save。GPU加速是非常特定于硬件的,我认为这方面的通用库永远不存在。我知道CUDA的专有产品,但它是针对C/C++(可以从C#和pinvoke一起使用)

在尝试极限GPU加速之前,我建议尝试替代的C#映像库,它可以提供比标准的.NET System.Drawing.imaging API更好的性能(您可以从列出的libs开始)


你也可以查一下。TurboJpeg是使用SIMD CPU指令(MMX、SSE2、AVX2、NEON、AltiVec)的本机库,当支持SIMD指令时,它声称在2x-6x中比其他jpeg编解码器速度更快-可能这对您来说就足够了(并且您的代码不会锁定在具体的GPU硬件上)。

您确定它真的适用于此代码段吗?。。大多数CPU负载发生在Image.Save内部,它在内部调用OSAPI(WindowsGDI)或本机映像库(比如Linux上)。我可能会假设Cudafy只能翻译非常简单的IL代码,这只对相当具体的计算有意义。Cudafy让它在GPU上工作:你有没有用Cudafy测试过这段代码,它确实提高了图像的性能。保存?这听起来像是真的。Save内部调用本机代码,而本机代码肯定无法自动转换为GPU的大规模并行代码。在性能方面,保证更好的结果是不现实的。它因您的场景和许多不同的参数而异。这只是提高执行力的一种方式。我很想听到这个具体案例的结果,但是我不能从我得到的代码块中保证任何东西。因此我写了“这可能会有帮助”在这种情况下,即使在理论上,库达菲也不会有帮助。在您提到的文章中,它用于大向量(数组)的快速运算,而GPU只能在专门为大规模并行计算编写的代码中有效。所有这一切都意味着GPU可以用于硬件加速的jpeg压缩,但这只有在实现面向GPU的压缩算法的专用库中才能实现。