目前,尝试通过网址下载图片并按照Apple商店完成PhotoScroller应用程序的方式平铺这些图片。 最大图像尺寸为4000 * 4000,采用RGB格式。我用tileize 256 * 256来平铺那些图像。 平铺映像并将文件写入磁盘需要很长时间。 正在寻找一种更好的方法,如果它可以平铺文件并加载到iPhone上。总共4个URL调用和每个URL调用获取图像并通过平铺过程并调用PhotoScroller应用程序在iphone上启动这些图像。
如果有人遇到过这些问题并且对此有更多了解,你能否分享一些想法。
-(void) startImageDownloading
{
if (!isImageRequested)
{
isImageRequested = YES;
self.responseData = [NSMutableData data];
URL1 = @"http://www.abc.com/image_id=1&size=1";
NSURLRequest *request1 = [NSURLRequest requestWithURL:[NSURL URLWithString:URL1]];
self.connection1= [[[NSURLConnection alloc] initWithRequest:request1 delegate:self] autorelease];
URL2 = @"http://www.abc.com/image_id=2&size=2";
NSURLRequest *request2 = [NSURLRequest requestWithURL:[NSURL URLWithString:URL2]];
self.connection2= [[[NSURLConnection alloc] initWithRequest:request2 delegate:self] autorelease];
URL3 = @"http://www.abc.com/image_id=3&size=3";
NSURLRequest *request3 = [NSURLRequest requestWithURL:[NSURL URLWithString:URL3]];
self.connection3= [[[NSURLConnection alloc] initWithRequest:request3 delegate:self] autorelease];
URL4 = @"http://www.abc.com/image_id=4&size=4";
NSURLRequest *request4 = [NSURLRequest requestWithURL:[NSURL URLWithString:URL4]];
self.connection4= [[[NSURLConnection alloc] initWithRequest:request4 delegate:self] autorelease];
}
}
- (void)saveTilesOfSize:(CGSize)size
forImage:(UIImage*)image
toDirectory:(NSString*)directoryPath
usingPrefix:(NSString*)prefix
{
CGFloat cols = [image size].width / size.width;
CGFloat rows = [image size].height / size.height;
int fullColumns = floorf(cols);
int fullRows = floorf(rows);
CGFloat remainderWidth = [image size].width - (fullColumns * size.width);
CGFloat remainderHeight = [image size].height - (fullRows * size.height);
if (cols > fullColumns) fullColumns++;
if (rows > fullRows) fullRows++;
CGImageRef fullImage = [image CGImage];
for (int y = 0; y < fullRows; ++y) {
for (int x = 0; x < fullColumns; ++x) {
CGSize tileSize = size;
if (x + 1 == fullColumns && remainderWidth > 0) {
// Last column
tileSize.width = remainderWidth;
}
if (y + 1 == fullRows && remainderHeight > 0) {
// Last row
tileSize.height = remainderHeight;
}
CGImageRef tileImage = CGImageCreateWithImageInRect(fullImage,(CGRect){{x*size.width, y*size.height},tileSize});
NSData *imageData = UIImagePNGRepresentation([UIImage imageWithCGImage:tileImage]);
CGImageRelease(tileImage);
NSString *path = [NSString stringWithFormat:@"%@/%@%d_%d.png",directoryPath, prefix, x, y];
[imageData writeToFile:path atomically:NO];
}
}
}
答案 0 :(得分:1)
由于你的图像是4000 x 4000并且在RGB中,下载和平铺在iPhone上需要很长时间,因为它是CPU密集型计算。
我已经看到通过从UIImagePNGRepresentation切换到UIImageJPEGRepresentation来保存文件的重大改进,所以你可以试试。
对于平铺,解决问题的最佳方法是在服务器上而不是在iPhone上进行。
答案 1 :(得分:1)
好像你正在重建整个图像,然后将它保存到每个磁贴的磁盘上(并且可能会再次渲染它),这是一种资源匮乏。
尝试这种方法:
将磁贴保存到磁盘,并行,
从磁盘读取磁贴,并通过在上下文中绘制它们在内存中构建它们。看看UIGraphicsBeginImageContext和[UIImage drawInRect]。 (不确定资源使用情况是否优于CGImageCreateWithImageInRect)
完成后,将其保存到磁盘。请参阅UIGraphicsGetImageFromCurrentImageContext
如果您在图像变大时遇到内存问题,您可能需要调整#3,即在磁贴数量上添加一个阈值,以便知道何时在达到内存限制之前将其保存到磁盘。
此外,我没有在您的代码中看到如何渲染要显示的图像,但setNeedsDisplayInRect对于仅在指定的矩形上渲染非常有用。但是,如果你正在使用CATiledLayer,那么这个组合会遇到一些问题,尝试更多地使用它或研究解决方案,直到你完全按照自己的意愿获得它。