Windows phone 8 如何在诺基亚图像SDK中使用颜色查找表编程图像过滤器

Windows phone 8 如何在诺基亚图像SDK中使用颜色查找表编程图像过滤器,windows-phone-8,nokia-imaging-sdk,lumia-imaging-sdk,Windows Phone 8,Nokia Imaging Sdk,Lumia Imaging Sdk,我有几个颜色查找表,看起来像。是否有使用诺基亚图像SDK中颜色查找表编程图像过滤器的指南。我现在改用诺基亚图像SDK,因为有人告诉我它更优化、更准确 目前代码如下所示 public WriteableBitmap Process() { int width = inputimage.PixelWidth; int height = inputimage.PixelHeight; int[] pixelArray = this.inputi

我有几个颜色查找表,看起来像。是否有使用诺基亚图像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;
    }
public WriteableBitmap进程()
{
int width=inputimage.PixelWidth;
int height=inputimage.PixelHeight;
int[]pixelArray=this.inputimage.Pixels;
对于(int i=0;i
CustomFilterBase或CustomEffectBase基类将允许您几乎直接转换此循环

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

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

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

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

编辑2:您应该能够通过如下方式访问像素。(还没有对演员阵容进行全面测试。C#对签名的准确性很挑剔。)

//在for循环中。。
var uintColor=(uint)wb.Pixels[i];
变量a=(字节)((uintColor>>24)和255);
var r=(字节)((uintColor>>16)和255);
变量g=(字节)((uintColor>>8)和255);
变量b=(字节)((uintColor)和255);
//做点什么。。

wb.Pixels[i]=(int)(b |)(g嘿,你能告诉我如何替换getpixel到数组访问。我正在处理可写位图,找不到任何数组访问方法。但是像素值不应该由字节定义吗?你能告诉我为什么wb.GetPixeli(px,py)和filter.Pixels[px*wb.PixelWidth+py];给出不同的结果??filter.Pixels吗[px+py*过滤器.像素高度]相同though@Rishabh876像素是int,因为它包含所有四个通道(argb)。因此4字节=int。至于filter.Pixels[px*wb.PixelWidth+py],等式是错误的。您需要将行号与图像的宽度相乘,并添加x位置。您所做的操作可能会让您出界!
// 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));