UIImagePNGRepresentation在CIFilter后返回nil

3

在使用CIAffineTransform旋转UIImage后,我遇到了无法获得PNG表示的问题。首先,我有一个UIImageView类别可以将图像顺时针旋转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的PNG表示顺时针旋转90度?

1个回答

4

不是在尖叫,但-M_PI_4会以最大精度给您所需的常数 :)

我看到的唯一其他事情是,除非您的图像已知为正方形,否则您可能希望使用[result extent]而不是[inputImage extent]。

不确定这是否会导致UIImagePNGRepresentation失败。 另一个想法...您创建了一个CGImage,然后在UIImage中使用CIImage,也许使用initWithCGImage会产生更好的结果。


看起来使用CGImage而不是CIImage是解决问题的关键。我还提高了精度。感谢您的提示! - Josh Edson
UIImagePNGRepresentation和CIImage存在一些问题,将我的代码迁移到使用CGImage后,它正常工作了。 - Bruno Morais

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接