0

現在、Apple ストアで PhotoScroller アプリが行われている方法で、URL を介して画像をダウンロードし、それらの画像を並べて表示しようとしています。最大画像サイズは 4000 * 4000 で、RGB 形式です。これらの画像をタイル サイズ 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];

    }
}    
}
4

2 に答える 2

1

画像全体を再構築してから、タイルごとにディスクに保存しているようです (おそらく再度レンダリングします)。これはリソースを大量に消費します。

このアプローチを試してください:

  1. タイルをディスクに保存し、並行して

  2. ディスクからタイルを読み取り、コンテキストで描画してメモリ内に構築します。UIGraphicsBeginImageContext と [UIImage drawInRect] を見てください。(リソースの使用が CGImageCreateWithImageInRect よりも優れているかどうかはわかりません)

  3. 完了したら、ディスクに保存します。UIGraphicsGetImageFromCurrentImageContext を参照してください。

画像が大きくなるにつれてメモリの問題が発生する場合は、#3 を微調整することをお勧めします。つまり、タイルの数にしきい値を追加して、メモリの制限に達する前にいつディスクに保存するかを知ることができます。

また、画像をレンダリングして表示する方法をコードで確認できませんでしたが、setNeedsDisplayInRect は、指定された長方形でのみレンダリングするのに役立ちます。ただし、CATiledLayer を使用している場合、この組み合わせにはいくつかの問題があります。希望どおりになるまで、もっと試してみるか、解決策を調査してください。

于 2011-06-29T07:46:50.493 に答える
1

画像は 4000 x 4000 で RGB であるため、CPU を集中的に使用する計算であるため、iPhone でのダウンロードとタイリングには確かに時間がかかります。

UIImagePNGRepresentation から UIImageJPEGRepresentation に切り替えることで、ファイルを保存するための大幅な改善が見られたので、試してみてください。

タイリングの場合、それを解決する最善の方法は、iPhone ではなくサーバーで行うことです。

于 2011-06-29T06:10:30.053 に答える