我有一个 CIImage,假设是 500x250 像素,我正在尝试平铺它,所以它将变成一张 1000x500 的图片,每行有两行两张图片,如下所示:
我正在尝试使用 Cocoa 上的 CIAffineTile 来做到这一点(我不确定这是否是最合适的过滤器)。
正如预期的那样,来自 Apple 的文档非常模糊和加密。
显然过滤器的调用方式必须与 iOS 和 OSX 不同,但 OSX 部分是神秘的。
这是我的代码:
我所做的是,我创建平铺过滤器,然后将其裁剪为每个方向上图片大小的两倍 + 2,以在它们之间创建 2 个像素的空间。
// the picture has to translate this amount?
CGAffineTransform translate = CGAffineTransformMakeTranslation(pictureWidth+2, pictureHeight+2);
CIFilter *filterTile = [CIFilter filterWithName:@"CIAffineTile"];
[filterTile setValue:[NSValue valueWithBytes:&translate
objCType:@encode(CGAffineTransform)]
forKey:@"inputTransform"];
CIVector *cropRect =[CIVector vectorWithX:0
Y:0
Z:2 * pictureWidth+2
W:2 * pictureHeight+2];
CIFilter *crop = [CIFilter filterWithName:@"CICrop"];
[crop setValue:[filterTile outputImage] forKey:@"inputImage"];
[crop setValue:cropRect forKey:@"inputRectangle"];
这会导致不正确的 CIImage。我看到的是这样的:
转换有什么问题?不是应该假设图像必须转换为平铺的像素数量吗?
最奇怪的部分:转换可以是任何东西,甚至身份转换和结果都是一样的。
我试图猜测如何在 OSX 上做到这一点,并想象出这样的事情:
NSAffineTransform *translate = [NSAffineTransform transform];
[translate translateXBy:(pictureWidth + 2) yBy:(pictureHeight + 2];
CIFilter *filterTile = [CIFilter filterWithName:@"CIAffineTile"];
[filterTile setValue:imagem forKey:@"inputImage"];
但这以逆时针旋转 90 度 (???) 图像结束。