我有几个颜色查找表,看起来像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;
}
答案 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));