让我们说你从一个UIImage开始,你想要裁剪它。最常见的方法是使用CGImageCreateWithImageInRect来获取CGImageRef并从中创建一个新图像,如下所示:
CGRect cropRect = CGRectMake(x*width, y*height, width, height);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
现在让我们说你以后需要将这个UIImage转换为NSData对象。例如,如果您希望使用NSKeyedArchiver将映像存储在磁盘上,则会发生这种情况。或者,您可以通过以下显式执行以下操作来获取NSData对象:
NSData *imageData = UIImagePNGRepresentation(croppedImage);
我做了这个,后来我尝试通过以下方式重建一个新的UIImage对象:
UIImage *image = [UIImage imageWithData:imageData];
我为一系列48张图片做了这个。他们中的大多数都很好,但是在每4张图片之后,接下来的两张图片都被破坏了,每张图片的顶部和底部都被交换了。如果我将转换转换为NSData并再次返回,它可以正常工作。如果我使用NSKeyedArchiver将图像数组写入磁盘(我在其编码例程中猜测调用UIImagePNGRepresentation之类的东西),我也会得到完全相同的问题。我的理论是这必须与我如何从CGImageRefs构建图像有关。
这是什么解决方法?我似乎无法弄清楚如何将CGImageRefs放入NSData对象中,我更喜欢正确构建UIImage的解决方案,以便它可以被序列化。
编辑:
有些人要求运行实际代码,所以我在这里添加
UIImage *image = self.animationObject.image;
for (int y=0; y<[self.animationInfoObject.numInY intValue]; y++) {
for (int x=0; x<[self.animationInfoObject.numInX intValue]; x++) {
CGRect cropRect = CGRectMake(x*width, y*height, width, height);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
NSData *imageData = UIImageJPEGRepresentation(croppedImage, 1.0);
[self addImageToArray:imageData];
CFRelease(imageRef);
}
}
self.animationObject.image中的图像是一个图像网格,每个方向都有numInX和numInY图像。我从2D网格中裁剪每个单独的图像并保存它们。
稍后,我将图像放在图像视图中以对其进行动画处理。这是代码:
NSMutableArray *animationArray = [[NSMutableArray alloc] init];
for (int frame=0; frame<[[photoObject frameArray] count]; frame++) {
NSData *imageData =[[photoObject imageArray] objectAtIndex:[[[photoObject frameArray] objectAtIndex:frame] integerValue]-1];
UIImage *image = [UIImage imageWithData:imageData];
[animationArray addObject:image];
}
这一切在iPhone 6上运行良好但在iPhone 5上不起作用。当图像网格很长时,它似乎也只是一个问题。例如,对于示例,我使用self.animationObject.image将numInY作为3和numInX 2,并且图像的总大小是1536x3072(每个迷你图像是768x1024)。底部两个图像的顶部和底部翻转。