5 c# xamarin.ios ios
给定CGImage或UIImage,如何应用自定义颜色查找表(也称为LUT,CLUT,Color Map)?也就是说,在给定映射的情况下,如何将图像中的颜色映射到新颜色?
Jac*_*hee 11
我将描述您可以采取的三种方法.
首先,从UIImage获取原始图像数据.您可以通过创建适当大小的字节数组(width*height*components),然后使用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);
}
Run Code Online (Sandbox Code Playgroud)
然后为输出图像创建一个字节数组(可能大小相同).迭代输入图像,查找查找表中的颜色值并将其写入输出图像.
您可以将输出字节通过构建转换为图像CGDataProvider从字节,然后CGImage从,然后UIImage从CGImage.
从iOS 5开始,Apple提供了许多内置的图像操作.通常,这些都比手动操作更容易使用和更快.但是,根据您的颜色查找表的指定方式,您可能找不到完美的搭配.
给定CIFilter,您可以设置inputImage,然后从OutputImage属性中检索输出.有关CICategoryColorAdjustment和CICategoryColorEffect类别中的过滤器列表,请参阅文档.在撰写本文时,我建议您查看CIToneCurve,CIFalseColor,CIColorMap和CIColorCube.可悲的是,在撰写本文时,CIColorMap在iOS上不可用.
如果您正在进行科学成像,并且您只使用两种颜色之间的线性渐变,我建议您查看CIFalseColor.
以下是使用随机颜色查找功能填充CIColorCube的示例.请注意,可以按名称(非类型安全)或强类型方式动态创建CIFilter.如果您知道在代码时要使用哪种过滤器,我建议使用强类型过滤器(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);
}
Run Code Online (Sandbox Code Playgroud)
最后,在放大率下保持正确的最通用的高性能方法是在GPU上进行颜色映射.这比前两种方法更省力,所以你需要决定它是否值得.
| 归档时间: |
|
| 查看次数: |
3295 次 |
| 最近记录: |