3

我有一个功能来检查图像是否只是一种颜色。

bool r = true;
Color checkColor = image.GetPixel(0, 0);

for (int x = 0; x < image.Width; x++)
  {
   for (int y = 0; y < image.Height; y++)
     {
      if (image.GetPixel(x, y) != checkColor) { r = false; }
     }
   }
// image color
clrOut = checkColor;
return r;

但是这个算法对于大图像来说很慢。有谁知道使用像素着色器和 GPU 的方法?

4

4 回答 4

6

您不需要像素着色器和 GPU 来加快速度。使用LockBits。Bob Powell 有一个很好的教程,教你做你想做的事。

于 2012-02-15T15:39:05.760 回答
2

还要查看您的代码,尝试反转 for 循环,它可以提供更好的内存访问

for( y... ... for ( x...

下一步是展开一些像素访问。尝试在内部循环中获取 4 或 8 个像素

for( y... ... for ( x = 0; x < image.Width ; x +=4 )

  pixel0 = image.getpixel(x,Y)
  pixel1 = image.getpixel(x +1,Y)
  pixel2 = image.getpixel(x +2,Y)
  pixel3 = image.getpixel(x +3,Y)

  if ( pixel0 ....

如前所述,使用 Bitmap Unlock 允许您通过指针访问像素,这是您在 CPU 上可以获得的最快速度。您也可以将循环排序和像素展开应用于该技术。
如果这还不够快,那么可以选择;C# 多线程或 GPU 与 OpenCL 及其 C# 绑定。

于 2012-02-27T00:28:31.567 回答
1

这段代码很慢,因为你使用GetPixel. 您可以通过使用直接指针访问来加快速度仅当这还不够时,我才会研究像素着色器。

我写了一些帮助库:https ://github.com/CodesInChaos/ChaosUtil/tree/master/Chaos.Image

特别是PixelsRawColor类型应该是有用的。

于 2012-02-15T15:39:52.727 回答
0

如果您只是在寻找具有大面积变化的图像而不是具有相同颜色的图像,您可以使用双线性过滤将其缩小到 1x1 像素并读取像素 0,0。如果像素与您期望的非常不同(RGB 距离与容差),您可以确定原始图像中存在一些变化。

当然,这取决于你真正想用这些信息做什么,所以 YMMV。

于 2012-02-15T16:22:23.947 回答