如何在iPhone 4(高清)上使用CGImageCreateWithImageInRect?

19

我使用下面的代码从精灵图中获取图片。在除了iPhone 4 (高清版本)之外的所有地方都能正常工作。

- (UIImage *)croppedImage:(CGRect)rect {
    CGImageRef image = CGImageCreateWithImageInRect([self CGImage], rect);
    UIImage *result = [UIImage imageWithCGImage:image];
    CGImageRelease(image);
    return result;
}

iPhone 4会自动加载图像的高清版本(sprites@2x.png),而不是sprites.png。原始图像具有2倍缩放比例,但结果图像具有1倍缩放比例和错误的大小。

如何处理这种行为,并考虑iPhone 3G[s]和iPhone 4之间的不同缩放比例?

我已经阅读了这篇文档,但关于使用CGImageCreateWithImageInRect的内容没有提到。


如果您能看一下我的答案,我会非常感兴趣。我相信有更好的方法来实现我们想要的结果。但是在这里正确的答案似乎不是关键点。您可以使用上面的代码+缩放的矩形翻译,看看它是否有效吗? - Daniel
2个回答

32
据我所知,CGImageCreateWithImageInRect 应该可以胜任。你需要更改的是 UIImage 的初始化方式。
参考这里,将其更改为 [UIImage imageWithCGImage:image scale:self.scale orientation:self.imageOrientation],它应该可以很好地工作。(假设这是 UIImage 的类别,看起来确实是这样)

3
谢谢。我错过了这个功能。 另外,我需要将源图像矩形乘以自身比例尺 self.scale。 - Victor
2
谢谢。这节省了我好几个小时 :-) 另外:我需要将比例因子乘以我的裁剪矩形尺寸,以使结果看起来正确。 - esbenr
1
是的,对矩形进行乘法似乎是一种奇怪的解决方法,因为它应该只是“做正确的事情”。关键在于比例尺,而不是答案中提到的这种方法。 - Daniel
1
我认为在调用CGImageCreateWithImageInRect之前,你需要将矩形放大两倍。 - fluke

14

您应该将裁剪矩形乘以图像比例。根据我的经验,使用任何不同的图像初始化是不必要的。

- (UIImage *)_cropImage:(UIImage *)image withRect:(CGRect)cropRect
{
    cropRect = CGRectMake(cropRect.origin.x * image.scale,
                          cropRect.origin.y * image.scale,
                          cropRect.size.width * image.scale,
                          cropRect.size.height * image.scale);

    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);

    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];

    CGImageRelease(imageRef);

    return croppedImage;
}

我发现这个可行,而上面的不行。可能是苹果更改了实现方式... - Flying_Banana

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