2013-03-15 114 views
3

我正在使用CIPixellate过滤器进行一些测试,我已使用该工具,但生成的图像大小各不相同。我认为这是有道理的,因为我正在改变输入的比例,但并不是我所期待的 - 我认为它会在图像的矩形内进行缩放。CIPixellate图像输出尺寸各不相同

我误解/使用过滤器错误或我只需要裁剪输出图像到我想要的大小。

另外,inputCenter参数不明白从我读取标题/试验和错误。任何人都可以解释那个参数是关于什么的?

NSMutableArray * tmpImages = [[NSMutableArray alloc] init]; 
for (int i = 0; i < 10; i++) { 
    double scale = i * 4.0; 
    UIImage* tmpImg = [self applyCIPixelateFilter:self.faceImage withScale:scale]; 
    printf("tmpImg width: %f height: %f\n", tmpImg.size.width, tmpImg.size.height); 
    [tmpImages addObject:tmpImg]; 
} 

tmpImg width: 480.000000 height: 640.000000 
tmpImg width: 484.000000 height: 644.000000 
tmpImg width: 488.000000 height: 648.000000 
tmpImg width: 492.000000 height: 652.000000 
tmpImg width: 496.000000 height: 656.000000 
tmpImg width: 500.000000 height: 660.000000 
tmpImg width: 504.000000 height: 664.000000 
tmpImg width: 508.000000 height: 668.000000 
tmpImg width: 512.000000 height: 672.000000 
tmpImg width: 516.000000 height: 676.000000 

- (UIImage *)applyCIPixelateFilter:(UIImage*)fromImage withScale:(double)scale 
{ 
    /* 
    Makes an image blocky by mapping the image to colored squares whose color is defined by the replaced pixels. 
    Parameters 

    inputImage: A CIImage object whose display name is Image. 

    inputCenter: A CIVector object whose attribute type is CIAttributeTypePosition and whose display name is Center. 
    Default value: [150 150] 

    inputScale: An NSNumber object whose attribute type is CIAttributeTypeDistance and whose display name is Scale. 
    Default value: 8.00 
    */ 
    CIContext *context = [CIContext contextWithOptions:nil]; 
    CIFilter *filter= [CIFilter filterWithName:@"CIPixellate"]; 
    CIImage *inputImage = [[CIImage alloc] initWithImage:fromImage]; 
    CIVector *vector = [CIVector vectorWithX:fromImage.size.width /2.0f Y:fromImage.size.height /2.0f]; 
    [filter setDefaults]; 
    [filter setValue:vector forKey:@"inputCenter"]; 
    [filter setValue:[NSNumber numberWithDouble:scale] forKey:@"inputScale"]; 
    [filter setValue:inputImage forKey:@"inputImage"]; 

    CGImageRef cgiimage = [context createCGImage:filter.outputImage fromRect:filter.outputImage.extent]; 
    UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:1.0f orientation:fromImage.imageOrientation]; 

    CGImageRelease(cgiimage); 

    return newImage; 
} 
+0

不知道这是否会帮助,但尝试的NSNumber numberWithFloat为输入标定 – Roecrew 2013-05-02 21:25:33

回答

0

有时inputScale不会平均分配你的形象,这是当我发现我得到大小不同的输出图像。

例如,如果inputScale = 0或1,则输出图像大小非常准确。

我发现图像周围的额外空间居中的方式因inputCenter“不透明”而异。也就是说,我没有花时间弄清楚究竟是如何(我通过点击位置来设置它)。

我对不同尺寸的解决方案是将图像重新渲染到输入图像的大小范围内,我在Apple Watch的黑色背景下进行渲染。

CIFilter *pixelateFilter = [CIFilter filterWithName:@"CIPixellate"]; 
[pixelateFilter setDefaults]; 
[pixelateFilter setValue:[CIImage imageWithCGImage:editImage.CGImage] forKey:kCIInputImageKey]; 
[pixelateFilter setValue:@(amount) forKey:@"inputScale"]; 
[pixelateFilter setValue:vector forKey:@"inputCenter"]; 
CIImage* result = [pixelateFilter valueForKey:kCIOutputImageKey];  
CIContext *context = [CIContext contextWithOptions:nil]; 
CGRect extent = [pixelateResult extent]; 
CGImageRef cgImage = [context createCGImage:result fromRect:extent]; 

UIGraphicsBeginImageContextWithOptions(editImage.size, YES, [editImage scale]); 
CGContextRef ref = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(ref, 0, editImage.size.height); 
CGContextScaleCTM(ref, 1.0, -1.0); 

CGContextSetFillColorWithColor(ref, backgroundFillColor.CGColor); 
CGRect drawRect = (CGRect){{0,0},editImage.size}; 
CGContextFillRect(ref, drawRect); 
CGContextDrawImage(ref, drawRect, cgImage); 
UIImage* filledImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
returnImage = filledImage; 

CGImageRelease(cgImage); 

如果你要坚持你的实现,我至少建议改变你提取您的UIImage使用原始图像的“规模”,不要与CIFilter规模相混淆的方式。

UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:fromImage.scale orientation:fromImage.imageOrientation]; 
0

问题是仅缩放

简单地做:

let result = UIImage(cgImage: cgimgresult!, scale: (originalImageView.image?.scale)!, orientation: (originalImageView.image?.imageOrientation)!) 
      originalImageView.image = result