iOS Image周围的白色像素使用CIFilter

时间:2016-07-26 22:05:21

标签: ios objective-c image uiimage cifilter

我在现有的UIImage周围添加了一个相框(带有透明背景的图像),并将其全部保存为一个图像。在模拟器上,一切看起来都很棒。但是在设备上,它会在帧的图像的某些区域周围添加一些白色像素。这是我的代码:

- (void)applyFilter {
    NSLog(@"Running");

    UIImage *borderImage = [UIImage imageNamed:@"IMG_8055.PNG"];

    NSData *dataFromImage = UIImageJPEGRepresentation(self.imgView.image, 1);

    CIImage *beginImage= [CIImage imageWithData:dataFromImage];

    CIContext *context = [CIContext contextWithOptions:nil];
    CIImage *border =[CIImage imageWithData:UIImagePNGRepresentation(borderImage)];
    border = [border imageByApplyingTransform:CGAffineTransformMakeScale(beginImage.extent.size.width/border.extent.size.width, beginImage.extent.size.height/border.extent.size.height)];

    CIFilter *filter= [CIFilter filterWithName:@"CISourceOverCompositing"];  //@"CISoftLightBlendMode"];
    [filter setDefaults];
    [filter setValue:border forKey:@"inputImage"];

    [filter setValue:beginImage forKey:@"inputBackgroundImage"];

    CIImage *outputImage = [filter valueForKey:@"outputImage"];







    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
    UIImage *newImg = [UIImage imageWithCGImage:cgimg];

    self.imgView.image = newImg;

}

以下是生成的图像:

enter image description here

图片中使用的帧图像如下所示:

enter image description here

以下是photoshop中帧图像的屏幕截图,显示PNG中不存在这些像素。

enter image description here

1 个答案:

答案 0 :(得分:0)

问题在于,如果你看一下你的图像,那些与音符紧邻的像素显然是不透明的。如果你注意到,那些出现在最终图像中的白色像素不仅仅是偶然的像素,而是出现在方块中。

这些平方像素噪声是JPEG伪像的标志。由于你在这个问题中添加的图像是JPEG(它不支持透明度),因此很难说是什么导致了这种情况。我想你必须有这个背景的PNG版本?您可能需要与我们分享以确认此诊断。

但最重要的是,您需要仔细检查原始图像和那些看似白噪声的像素的透明度。确保在创建/操作这些图像时避免使用JPEG文件格式,因为它会丢失透明度信息并引入工件。 PNG文件通常更安全。