gpt4 book ai didi

c# - 如何将 LUT(颜色查找表)应用于 IOS 中的 CGImage 或 UIImage?

转载 作者:可可西里 更新时间:2023-11-01 04:21:36 36 4
gpt4 key购买 nike

给定 CGImage 或 UIImage,我如何应用自定义颜色查找表(也称为 LUT、CLUT、颜色映射)?也就是说,如何在给定映射的情况下将图像中的颜色映射到新颜色?

最佳答案

我将描述您可以采用的三种方法。

  1. 手动完成
  2. 使用 CIFilter (适用于 iOS 5)
  3. 使用着色器(GPU程序)

手动方法

首先,从 UIImage 中获取原始图像数据。您可以通过创建一个适当大小(宽度 * 高度 * 组件)的字节数组,然后使用 CGBitmapContext 绘制到它来完成此操作。像这样:

    using (var colorSpace = CGColorSpace.CreateDeviceRGB())
using (var context = new CGBitmapContext(
bytes, width, height, bitsPerComponent, bytesPerRow,
colorSpace, CGBitmapFlags.ByteOrder32Big | CGBitmapFlags.PremultipliedLast))
{
var drawRect = new RectangleF(-rectangle.X, -rectangle.Y, image.CGImage.Width, image.CGImage.Height);
context.ClipToRect(new RectangleF(0, 0, width, height));
context.DrawImage(drawRect, image.CGImage);
}

然后为输出图像创建一个字节数组(可能大小相同)。遍历输入图像,在查找表中查找颜色值并将它们写入输出图像。

您可以通过从字节构造一个CGDataProvider,然后从中构造一个CGImage,然后构造一个UIImage,将输出字节转换为图像> 来自 CGImage

CIFilter方法

从 iOS 5 开始,Apple 提供了许多内置的图像操作。一般来说,这些比手动操作更容易使用并且更快。但是,根据您的颜色查找表的指定方式,您可能找不到最合适的。

给定一个 CIFilter,您可以设置 inputImage,然后从 OutputImage 属性中检索输出。查看documentation获取 CICategoryColorAdjustment 和 CICategoryColorEffect 类别中的过滤器列表。在撰写本文时,我建议查看 CIToneCurve、CIFalseColor、CIColorMap 和 CIColorCube。遗憾的是,在撰写本文时,CIColorMap 在 iOS 上不可用。

如果您正在进行科学成像,并且只在两种颜色之间使用线性渐变,我建议您查看 CIFalseColor

这是一个使用随机颜色查找函数填充 CIColorCube 的示例。请注意,CIFilters 可以通过名称(不是类型安全的)或以强类型的方式动态创建。如果您知道要在代码时使用什么过滤器,我建议使用强类型过滤器(CIColorCube 而不是 CIFilter.FromName("CIColorCube"))。我在下面的例子中使用了动态方法,因为它更容易混淆。

static void PopulateColorCubeFilter(CIFilter filter)
{
if (filter.Name != "CIColorCube")
return;

int dimension = 64; // Must be power of 2, max of 128 (max of 64 on ios)
int cubeDataSize = 4 * dimension * dimension * dimension;
filter[new NSString("inputCubeDimension")] = new NSNumber(dimension);

// 2 : 32 /4 = 8 = 2^3
// 4 : 256 /4 = 64 = 4^3
// 8 : 2048 /4 = 512 = 8^3

var cubeData = new byte[cubeDataSize];
var rnd = new Random();
rnd.NextBytes(cubeData);
for (int i = 3; i < cubeDataSize; i += 4)
cubeData[i] = 255;
filter[new NSString("inputCubeData")] = NSData.FromArray(cubeData);
}

GPU 着色器方法

最后,在放大下保持正确的最通用的高性能方法是在 GPU 上进行颜色映射。这比前两种方法更费力,因此您需要决定它是否值得。

  1. 使用您的输入图像加载一个纹理贴图(也称为 Sampler2D)
  2. 使用您的颜色贴图加载第二个纹理贴图(实际上它是一维纹理,但对于 OpenGL ES 可能需要作为二维纹理加载)
  3. 将两个纹理贴图和一个着色器应用于四边形
  4. 在着色器中使用纹理坐标在第一个纹理中查找颜色,然后使用第一个纹理中的值在第二个纹理中查找。那就是你的输出颜色。

关于c# - 如何将 LUT(颜色查找表)应用于 IOS 中的 CGImage 或 UIImage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11258323/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com