我正在尝试将*.cube
文件(这是许多3d-LUT格式之一)包装成
NSData
用作CIColorCube
过滤器的数据输入。
我使用的LUT是32维,虽然我认为我们的长度合适,
结果是灰色的。我的LUT是32 * 32 * 32行的三元组,但现在我怀疑CIColorCube
期望第四个数字代表Alpha。这是对的吗?
我的表中的所有值都已经预乘,其范围为0.0 - 1.0
。我最近的尝试是编辑我的表并在每行中添加1作为第四个数字。我还删除了原始*.cube
文件中的所有标题和文字,并保存为*.txt
。然后我将数据长度计算为32*32*32*4*sizeof(float)
,并使用32作为多维数据集维度。在这种情况下,我没有收到有关意外长度的错误,但结果都是错误的。
以下是我们使用的代码。代码使用新的*.txt
文件,但当然我们首先开始使用
与原*.cube
。这是格式化问题吗?
代码下方是原始*.cube
文件的摘录和我编辑过的代码段
*.txt
尝试。
NSString *docsDir = [[NSBundle mainBundle] resourcePath];
NSString *soundFilePath=[[NSString alloc] init];
soundFilePath=[docsDir stringByAppendingPathComponent:@"Inkwell-withAlpha.txt"];
NSData *testData = [NSData dataWithContentsOfFile:soundFilePath];
NSData * cube_data =[NSData dataWithBytes:testData.bytes length:32*32*32*4*sizeof(float)];
CIFilter *filter = [CIFilter filterWithName:@"CIColorCube"];
[filter setValue:_ciImage forKey:kCIInputImageKey];
[filter setValue:@2 forKey:@"inputCubeDimension"];
[filter setValue:cube_data forKey:@"inputCubeData"];
CIImage *outImage = filter.outputImage;
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef outputImageRef = [context createCGImage:outImage fromRect:[outImage extent]];
previewImageView.image = [UIImage imageWithCGImage:outputImageRef];
原始* .cube文件开头的示例:
TITLE "Inkwell"
LUT_3D_SIZE 32
0.0000 0.0000 0.0000
0.0000 0.0000 0.0000
0.0000 0.0000 0.0000
0.0039 0.0039 0.0039
0.0235 0.0235 0.0235
0.0353 0.0353 0.0353
0.0549 0.0549 0.0549
0.0745 0.0745 0.0745
0.0863 0.0863 0.0863
...
* .txt文件开头的示例我试图阅读:
0.0000 0.0000 0.0000 1
0.0000 0.0000 0.0000 1
0.0000 0.0000 0.0000 1
0.0039 0.0039 0.0039 1
0.0235 0.0235 0.0235 1
0.0353 0.0353 0.0353 1
0.0549 0.0549 0.0549 1
...
答案 0 :(得分:0)
NSData *testData = [NSData dataWithContentsOfFile:soundFilePath];
NSData * cube_data =[NSData dataWithBytes:testData.bytes length:32*32*32*4*sizeof(float)];
testData.bytes将是文档中值的字符编码,即字符' 0'不是数字0. NSData不知道文本文件包含数字并且不会为您做任何转换。如果你真的想从文本文档中导入它,你将不得不手动拆分字符串,如:
- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator
然后使用
转换数组中的每个元素- (float)floatValue.