UIFmagePNGRepresentation在CIFilter之后返回nil

时间:2014-02-26 19:57:29

标签: ios uiimage core-image

使用CIAffineTransform旋转后,遇到UIImage的PNG表示问题。首先,我在UIImage上有一个类别,可以将图像顺时针旋转90度。当我在UIImageView中显示旋转的图像时,它似乎正常工作。

-(UIImage *)cwRotatedRepresentation
{
    // Not very precise, stop yelling at me.
    CGAffineTransform xfrm=CGAffineTransformMakeRotation(-(6.28 / 4.0));
    CIContext *context=[CIContext contextWithOptions:nil];
    CIImage *inputImage=[CIImage imageWithCGImage:self.CGImage];
    CIFilter *filter=[CIFilter filterWithName:@"CIAffineTransform"];
    [filter setValue:inputImage forKey:@"inputImage"];
    [filter setValue:[NSValue valueWithBytes:&xfrm objCType:@encode(CGAffineTransform)] forKey:@"inputTransform"];

    CIImage *result=[filter valueForKey:@"outputImage"];
    CGImageRef cgImage=[context createCGImage:result fromRect:[inputImage extent]];

    return [[UIImage alloc] initWithCIImage:result];

}

然而,当我尝试为新旋转的图像实际获得PNG时,UIImagePNGRepresentation返回nil。

-(NSData *)getPNG
{
    UIImage *myImg=[UIImage imageNamed:@"canada"];
    myImg=[myImg cwRotatedRepresentation];
    NSData *d=UIImagePNGRepresentation(myImg);

    // d == nil :(
    return d;
}

核心图像是否会覆盖PNG标题或其他内容?有没有办法绕过这种行为,或者是一种更好的方法来实现UIImage顺时针旋转90度的PNG表示的理想结果?

1 个答案:

答案 0 :(得分:4)

不要大喊大叫,但是-M_PI_4会以最高精度为你提供你想要的常数:)

我看到的唯一另一件事是你可能想要使用[result extent]而不是[inputImage extent],除非你的图像是已知的方形。

不确定这会导致UIImagePNGRepresentation失败。另一个想法...你创建一个CGImage,然后在UIImage中使用CIImage,也许使用initWithCGImage可以得到更好的结果。