0

我为 iPhone 3 开发了一个瓷砖游戏应用程序。在其中,我从资源中获取了一张图像,并使用CGImageCreateWithImageInRect ( originalImage.CGImage, frame );函数将其划分为多个瓷砖。

它适用于所有 iPhone,但现在我希望它也适用于 Retina 显示器。

因此,根据此链接,我拍摄了另一张图像,其尺寸是当前图像尺寸的两倍,并通过添加后缀 @2x 对其进行重命名。但问题是它只占用了视网膜显示图像的上半部分。我认为那是因为我在使用时设置的框架CGImageCreateWithImageInRect。那么为了完成这项工作应该做些什么。

任何形式的帮助将不胜感激。

提前致谢...

4

2 回答 2

1

问题很可能是 @2x 图像比例仅针对 UIImage 的某些初始化程序自动正确设置... 尝试使用来自 Tasty Pixel 的类似代码加载 UIImages。 该链接的条目更多地讨论了这个问题。

使用UIImage+TPAdditions链接中的类别,您将像这样实现它(在确保图像及其 @2x 对应项在您的项目中之后):

NSString *baseImagePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSString *myImagePath = [baseImagePath stringByAppendingPathComponent:@"myImage.png"]; // note no need to add @2x.png here
UIImage *myImage = [UIImage imageWithContentsOfResolutionIndependentFile:myImagePath];

然后你应该可以使用CGImageCreateWithImageInRect(myImage.CGImage, frame);

于 2011-01-15T08:55:50.237 回答
0

以下是我如何让它在我做的应用程序中工作:

//this is a method that takes a UIImage and slices it into 16 tiles (GridSize * GridSize)
#define GridSize 4
- (void) sliceImage:(UIImage *)image {
    CGSize imageSize = [image size];
    CGSize square = CGSizeMake(imageSize.width/GridSize, imageSize.height/GridSize);

    CGFloat scaleMultiplier = [image scale];

    square.width *= scaleMultiplier;
    square.height *= scaleMultiplier;

    CGFloat scale = ([self frame].size.width/GridSize)/square.width;

    CGImageRef source = [image CGImage];
    if (source != NULL) {
        for (int r = 0; r < GridSize; ++r) {
            for (int c = 0; c < GridSize; ++c) {
                CGRect slice = CGRectMake(c*square.width, r*square.height, square.width, square.height);
                CGImageRef sliceImage = CGImageCreateWithImageInRect(source, slice);
                if (sliceImage) {
                    //we have a tile (as a CGImageRef) from the source image
                    //do something with it
                    CFRelease(sliceImage);
                }
            }
        }
    }
}

诀窍是使用该-[UIImage scale]属性来确定您应该切片多大的矩形。

于 2011-01-15T18:30:39.427 回答