Windows phone 8 如何在诺基亚图像SDK中使用颜色查找表编程图像过滤器
我有几个颜色查找表,看起来像。是否有使用诺基亚图像SDK中颜色查找表编程图像过滤器的指南。我现在改用诺基亚图像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
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));