gpt4 book ai didi

iphone - 使用 CATiledLayer 显示已以编程方式拆分为图 block 的大图像

转载 作者:行者123 更新时间:2023-11-29 13:20:50 25 4
gpt4 key购买 nike

我在使用 CATiledLayer 时遇到了问题...我有一个大图像,一张 map ,它是 4726 x 2701。基本上我需要将这个图像分解成图 block 并能够放大查看很多细节,而且还能够一直放大并查看整个 map 。使用我当前的实现,如果将 ScrollView 的缩放级别设置为 1.0(最大缩放比例),它可以完美运行,但如果缩小,则拼贴将被错误地替换。

此处缩放级别设置为 1.0。 map 看起来很完美。 enter image description here

但是如果缩放级别完全超出(我相信是 0.2), map 就会一团糟。我应该看到整个 map ,而不仅仅是两个图 block 。

enter image description here

下面是我如何从大图像中获取图 block :

- (UIImage *)tileForScale:(CGFloat)scale row:(int)row col:(int)col {
float tileSize = 256.0f;
CGRect subRect = CGRectMake(col*tileSize, row * tileSize, tileSize, tileSize);
CGImageRef tiledImage = CGImageCreateWithImageInRect([mapImage CGImage], subRect);
UIImage *tileImage = [UIImage imageWithCGImage: tiledImage];
return tileImage;
}

我显示的图 block 与 Apple 在 PhotoScroller 应用程序中所做的完全一样。

- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat scale = CGContextGetCTM(context).a;

CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
CGSize tileSize = tiledLayer.tileSize;
tileSize.width /= scale;
tileSize.height /= scale;

int firstCol = floorf(CGRectGetMinX(rect) / tileSize.width);
int lastCol = floorf((CGRectGetMaxX(rect)-1) / tileSize.width);
int firstRow = floorf(CGRectGetMinY(rect) / tileSize.height);
int lastRow = floorf((CGRectGetMaxY(rect)-1) / tileSize.height);

for (int row = firstRow; row <= lastRow; row++) {
for (int col = firstCol; col <= lastCol; col++) {
UIImage *tile = [self tileForScale:scale row:row col:col];
CGRect tileRect = CGRectMake(tileSize.width * col, tileSize.height * row,
tileSize.width, tileSize.height);
tileRect = CGRectIntersection(self.bounds, tileRect);

[tile drawInRect:tileRect];
}
}
}

此外,这是我设置细节级别的代码,它为我的图像返回 4:

- (id)initWithImageName:(NSString *)name andImage:(UIImage*)image size:(CGSize)size {
self = [super initWithFrame:CGRectMake(0, 0, size.width, size.height)];
if (self) {
_imageName = [name retain];
mapImage = [image retain];

CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
tiledLayer.levelsOfDetail = [self zoomLevelsForSize:mapImage.size];
}
return self;
}
- (NSUInteger)zoomLevelsForSize:(CGSize)imageSize {
int zLevels = 1;
while(YES) {
imageSize.width /= 2.0f;
imageSize.height /= 2.0f;
if(imageSize.height < 256.0 || imageSize.width < 256.0) break;
++zLevels;
}
return zLevels;
}

我假设它与图 block 大小和缩放比例有关,但我真的不知道如何解决这个问题。我似乎无法在 Google 上找到任何解决我的问题的方法。任何帮助都会很棒! :)

最佳答案

您在 - (UIImage *)tileForScale:(CGFloat)scale row:(int)row col:(int)col 中有泄漏。

CGImageRef tiledImage = CGImageCreateWithImageInRect([mapImage CGImage], subRect);

不要忘记释放 CGImageRef:CGImageRelease(tiledImage);

关于iphone - 使用 CATiledLayer 显示已以编程方式拆分为图 block 的大图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14392818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com