如何使用诺基亚成像SDK中的颜色查找表对图像过滤器进行编程

时间:2014-06-05 10:57:01

标签: windows-phone-8 nokia-imaging-sdk lumia-imaging-sdk

我有几个颜色查找表,看起来像this。是否有指南可用于使用诺基亚成像SDK中的颜色查找表对图像过滤器进行编程。我正在转向诺基亚成像SDK,因为我被告知它更加优化和准确。

目前代码看起来像这样。

public WriteableBitmap Process()
    {
        int width = inputimage.PixelWidth;
        int height = inputimage.PixelHeight;

        int[] pixelArray = this.inputimage.Pixels;

        for (int i = 0; i < width; i++)
        {           

            for (int j = 0; j < height; j++)
            {
                // Extract color components
                var c = inputimage.GetPixel(i,j);
                var b = c.B;
                var g = c.G;
                var r = c.R;
                var a = c.A;

                int blockBlue = b / 4;
                int blockGreen = g / 4;
                int blockRed = r / 4;

                int right = blockBlue % 8;
                int down = blockBlue / 8;

                int px = right * 64 + blockRed;
                int py = down * 64 + blockGreen;


                Color clr = LookUpTable.GetPixel(px, py);

                // Set result color
                inputimage.SetPixel(i, j, clr);                    
            }
        }

        return wBmp;
    }

1 个答案:

答案 0 :(得分:1)

CustomFilterBase或CustomEffectBase基类将允许您几乎直接翻译此循环。

我不确定你是否会为这个RGB LUT获得更好的性能或准确度,因为它已经非常简单了。我看到的主要内容是GetPixel / SetPixel,你真的应该改为直接数组访问。还要避免使用Color类。理想情况下,读取和写入32位uint值,屏蔽并移出部件。

第二个改进是如果你可以约束存储在LUT中的函数。

如果它可以表示为单独的红色,绿色和蓝色LUT,则可以使用Imaging SDK中的CurvesFilter类。即使没有SDK,这也会加快速度,因为这些表可以更接近L1或L2缓存中的CPU。

编辑:诺基亚成像SDK 1.2的最终版本(即将发布)有一些精确的改进,也可能是相关的,顺便说一句。

编辑2:您应该能够使用以下内容访问像素。 (没有完全测试演员阵容。对于签名,C#很挑剔。)

// in for loop..

var uintColor = (uint)wb.Pixels[i];
var a = (byte)((uintColor >> 24) & 255);
var r = (byte)((uintColor >> 16) & 255);
var g = (byte)((uintColor >> 8) & 255);
var b = (byte)((uintColor) & 255);

// ..do something..

wb.Pixels[i] = (int)(b | (g << 8) | (r << 16) | (a << 24));