- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给这个问题一些背景(呵呵呵):
为了创建一些自定义照片效果滤镜,我在 iOS 下将 CIFilter 子类化。根据 documentation ,这意味着创建一个“复合”过滤器,将一个或多个预先存在的 CIFilter 封装在我的自定义 CIFilter 子类的保护伞内。
一切都很好。那里没有问题。举个例子,假设我封装了一个 CIColorMatrix 滤镜,该滤镜已使用某些 rgba 输入向量进行了预设。
当应用我的自定义过滤器(或实际上单独使用 CIColorMatrix)时,我看到在使用颜色管理开启和关闭的 CIContext 时截然不同的结果。我正在按如下方式创建我的上下文:
颜色管理:
CIContext * context = [CIContext contextWithOptions:nil];
关闭颜色管理:
NSDictionary *options = @{kCIContextWorkingColorSpace:[NSNull null], kCIContextOutputColorSpace:[NSNull null]};
CIContext * context = [CIContext contextWithOptions:options];
现在,这并不奇怪。但是,我注意到所有预构建的 CIPhotoEffect CIFilters,例如CIPhotoEffectInstant,在相同的两种颜色管理条件下本质上是不变的。
任何人都可以提供任何关于是什么赋予他们这种属性的见解吗?例如,它们本身是否封装了可能具有类似不变性的特定 CIFilter?
我的目标是创建一些具有相同属性的自定义滤镜,而不限于仅链接 CIPhotoEffect 滤镜。
--
编辑:感谢 YuAo,我整理了一些工作代码示例并发布在这里以帮助其他人:
以编程方式生成的 CIColorCubeWithColorSpace CIFilter,在不同的颜色管理方案/工作颜色空间下不变:
self.filter = [CIFilter filterWithName:@"CIColorCubeWithColorSpace"];
[self.filter setDefaults];
int cubeDimension = 2; // Must be power of 2, max 128
int cubeDataSize = 4 * cubeDimension * cubeDimension * cubeDimension; // bytes
float cubeDataBytes[8*4] = {
0.0, 0.0, 0.0, 1.0,
0.1, 0.0, 1.0, 1.0,
0.0, 0.5, 0.5, 1.0,
1.0, 1.0, 0.0, 1.0,
0.5, 0.0, 0.5, 1.0,
1.0, 0.0, 1.0, 1.0,
0.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0
};
NSData *cubeData = [NSData dataWithBytes:cubeDataBytes length:cubeDataSize * sizeof(float)];
[self.filter setValue:@(cubeDimension) forKey:@"inputCubeDimension"];
[self.filter setValue:cubeData forKey:@"inputCubeData"];
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
[self.filter setValue:(__bridge id)colorSpace forKey:@"inputColorSpace"];
[self.filter setValue:sourceImageCore forKey:@"inputImage"];
CIImage *filteredImageCore = [self.filter outputImage];
CGColorSpaceRelease(colorSpace);
文档状态:
To provide a CGColorSpaceRef object as the input parameter, cast it to type id. With the default color space (null), which is equivalent to kCGColorSpaceGenericRGBLinear, this filter’s effect is identical to that of CIColorCube.
我想更进一步,能够从文件中读取 cubeData。所谓的 Hald 颜色查找表,或 Hald CLUT images可用于定义从输入颜色到输出颜色的映射。
在 this 的帮助下答案,我也组装了代码来做到这一点,为方便起见转贴在这里。
基于CLUT图像的CIColorCubeWithColorSpace CIFilter,在不同颜色管理方案/工作颜色空间下不变:
用法:
NSData *cubeData = [self colorCubeDataFromLUT:@"LUTImage.png"];
int cubeDimension = 64;
[self.filter setValue:@(cubeDimension) forKey:@"inputCubeDimension"];
[self.filter setValue:cubeData forKey:@"inputCubeData"];
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); // or whatever your image's colour space
[self.filter setValue:(__bridge id)colorSpace forKey:@"inputColorSpace"];
[self.filter setValue:sourceImageCore forKey:@"inputImage"];
辅助方法(使用 Accelerate Framework):
- (nullable NSData *) colorCubeDataFromLUT:(nonnull NSString *)name
{
UIImage *image = [UIImage imageNamed:name inBundle:[NSBundle bundleForClass:self.class] compatibleWithTraitCollection:nil];
static const int kDimension = 64;
if (!image) return nil;
NSInteger width = CGImageGetWidth(image.CGImage);
NSInteger height = CGImageGetHeight(image.CGImage);
NSInteger rowNum = height / kDimension;
NSInteger columnNum = width / kDimension;
if ((width % kDimension != 0) || (height % kDimension != 0) || (rowNum * columnNum != kDimension)) {
NSLog(@"Invalid colorLUT %@",name);
return nil;
}
float *bitmap = [self createRGBABitmapFromImage:image.CGImage];
if (bitmap == NULL) return nil;
// Convert bitmap data written in row,column order to cube data written in x:r, y:g, z:b representation where z varies > y varies > x.
NSInteger size = kDimension * kDimension * kDimension * sizeof(float) * 4;
float *data = malloc(size);
int bitmapOffset = 0;
int z = 0;
for (int row = 0; row < rowNum; row++)
{
for (int y = 0; y < kDimension; y++)
{
int tmp = z;
for (int col = 0; col < columnNum; col++) {
NSInteger dataOffset = (z * kDimension * kDimension + y * kDimension) * 4;
const float divider = 255.0;
vDSP_vsdiv(&bitmap[bitmapOffset], 1, ÷r, &data[dataOffset], 1, kDimension * 4); // Vector scalar divide; single precision. Divides bitmap values by 255.0 and puts them in data, processes each column (kDimension * 4 values) at once.
bitmapOffset += kDimension * 4; // shift bitmap offset to the next set of values, each values vector has (kDimension * 4) values.
z++;
}
z = tmp;
}
z += columnNum;
}
free(bitmap);
return [NSData dataWithBytesNoCopy:data length:size freeWhenDone:YES];
}
- (float *)createRGBABitmapFromImage:(CGImageRef)image {
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
unsigned char *bitmap;
NSInteger bitmapSize;
NSInteger bytesPerRow;
size_t width = CGImageGetWidth(image);
size_t height = CGImageGetHeight(image);
bytesPerRow = (width * 4);
bitmapSize = (bytesPerRow * height);
bitmap = malloc( bitmapSize );
if (bitmap == NULL) return NULL;
colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL) {
free(bitmap);
return NULL;
}
context = CGBitmapContextCreate (bitmap,
width,
height,
8,
bytesPerRow,
colorSpace,
(CGBitmapInfo)kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease( colorSpace );
if (context == NULL) {
free (bitmap);
return NULL;
}
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
CGContextRelease(context);
float *convertedBitmap = malloc(bitmapSize * sizeof(float));
vDSP_vfltu8(bitmap, 1, convertedBitmap, 1, bitmapSize); // Converts an array of unsigned 8-bit integers to single-precision floating-point values.
free(bitmap);
return convertedBitmap;
}
人们可以通过获取身份图像(谷歌!)创建 Hald CLUT 图像,然后对其应用相同的图像处理链,该图像处理链应用于图像,用于在任何图像编辑程序中可视化“外观”。只需确保将示例代码中的 cubeDimension 设置为 LUT 图像的正确尺寸。如果维度 d 是沿 3D LUT 立方体一侧的元素数,则 Hald CLUT 图像宽度和高度将为 d*sqrt(d) 像素,图像将有 d^3 总像素。
最佳答案
CIPhotoEffect
内部使用CIColorCubeWithColorSpace
过滤器。
所有颜色立方体数据都存储在 CoreImage.framework
中。
您可以在此处找到模拟器的 CoreImage.framework
(/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/库/Frameworks/CoreImage.framework/
).
颜色立方体数据以 scube
路径扩展命名。例如CIPhotoEffectChrome.scube
CIColorCubeWithColorSpace
使用私有(private)方法在内部隐藏颜色立方体颜色值以匹配当前核心图像上下文的工作颜色空间:
-[CIImage _imageByMatchingWorkingSpaceToColorSpace:];
-[CIImage _imageByMatchingColorSpaceToWorkingSpace:];
关于ios - CIPhotoEffect CIFilters 在颜色管理方面是不变的。是什么赋予了 CIPhotoEffect 滤镜这个属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35049596/
Solr中有什么方法可以给同义词赋予权重? (由 SynonymFilterFactory 生成) 问题的较长版本/一些背景: 我们希望为 SynonymFilterFactory 注入(inject
假设我有一个可以扩展的 A 类。在 A 类中,我有一个列表 List 。所以这个类将包含一个包含元素 A 的列表。现在,如果我将这个类 B 扩展为 A 的子类,我希望类 B 具有相同的成员 List
有没有办法让 SKNode 拥有自己的物理特性?我有一个 SKShapeNode 调用“backGround”,我将其用作大多数其他节点的父节点。我不断地将“背景”向左移动,给人一种玩家正在前进的错觉
我想观察一个由完全独立的代码修改的 ObservableList。我的问题是,我不仅希望在列表更改时调用 ListChangeListener(当我附加监听器时,列表可能已经包含元素),而且我还希望将
我正在尝试通过按最匹配的记录对记录进行排序来改进我的网站之一中的搜索功能。 我有以下 mysql 表。 调查回复 +--------+-------------+------------------+
我想给予 最高优先级.在我的示例中,我想要 的背景-要显示的元素,而不是为 指定的内容-元素。 h1{ background-color:blue1!important } 但它在下面的上下
我正在使用 SliverAppBar和 SliverListView在我的项目中。 我需要BorderRadius到我的 SliverList这是我的 SliverAppBar 的底部. 这是我需要的
我有它,这样当您(PaintBrush)完成时,一切都会清除并出现一个按钮。单击该按钮时,它开始二级,在这里它创建一个新的 Canvas 。我添加了一些代码,以便在单击按钮时删除旧 Canvas ,然
在下面的代码中,我分析给定的包以获取使用给定注释注释的所有类。 我想将它们及其注释(及其值)加载到 map 中。 package com.test @Named("valueToStock") pub
HTML: Div CSS: body{ width: 600px; height: 600px; background: red; }
我在我的图片库中应用了 jquery lighbox,但由于图像大小可变,灯箱大小不固定,因此以图像的原始大小打开,这反过来导致 biga 图像超出屏幕并显示浏览器中的水平滚动条。 因此,我正在寻找将
无论如何,包含文件是否可以在父范围内使用到它被调用的范围?以下示例经过简化,但完成相同的工作。 本质上,一个文件将被一个函数包含,但希望被包含文件的范围是调用包含它的函数的范围。 主.php: get
我有一个 html 页面,其中包含许多使用 a 标记的链接。我想在不同的选项卡中打开所有链接,而不是在所有标签中设置 target="_blank" ,有没有像下面的css那样做: a{target=
我正在使用 Zend_Navigation 并试图将它与 Zend_Acl 集成。导航中的每个页面都有一个 privilege 属性。我无法确定的是如何为单个页面定义多个权限。 用例:用于管理用户的页
所以,我的代码(Perl 脚本和 Perl 模块)位于这样的树中: trunk/ util/ process/ scripts/ 'util' 目录有,嗯,实用程序,'pr
这个问题在这里已经有了答案: How to clone a Date object? (8 个答案) 关闭 4 年前。 我正在处理日期,我的代码如下所示: (currentDate 只是要记住的实际
我刚开始使用 Crashlytics。我已经开始探索使用日志记录并创建了一个示例 ios 项目来测试它。我可以看到 CLSLogv 命令的第一个参数,但缺少第二个参数 例子:CLSLogv("Butt
我是 asp.net 的新手,我想为链接标签添加样式。我的代码如下: Guest .userlabel { display:inline-block; text-decoration:
我有一个页面,其中我使用 HTML 表格中的 RadiobuttonList。我已经为 table 和 td 提供了 CSS 样式。我还为 RadioButtonList 提供了 CSS 样式,但它没
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我是一名优秀的程序员,十分优秀!