Программно мозаичные изображения для PhotoScroller - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть приложение, которое загружает огромные картинки из корзины S3.После того, как я их загрузил, я накладываю на них следующий код:

- (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;

    NSLog(@"cols: %f rows: %f", cols, rows);

    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];

    int tilecount = 0;

    for (int y = 0; y < fullRows; ++y) {
        for (int x = 0; x < fullColumns; ++x) {
            tilecount++;
            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]);
            NSString *path = [NSString stringWithFormat:@"%@/%@%d_%d.png", 
                              directoryPath, prefix, x, y];
            [imageData writeToFile:path atomically:NO];

            float prg = tilecount/200.0;
            [self performSelectorOnMainThread:@selector(setTileProgress:) withObject:[[NSNumber alloc] initWithFloat:prg] waitUntilDone:NO];
        }
    }
    [self performSelectorOnMainThread:@selector(setTileProgress:) withObject:[[NSNumber alloc] initWithFloat:100.0] waitUntilDone:NO];
}

Это работает с любовью, чтобы генерировать максимально увеличенные плитки, но мне также нужно генерировать масштабированные плитки.Я думаю, что могу взять UIImage и масштабировать его, как в следующем коде, а затем просто передать это масштабированное изображение модифицированному методу saveTilesOfSize вместе с параметром масштаба, чтобы сгенерировать другие изображения масштаба (500, 250, 125).

UIImage *scaledImage = [UIImage imageWithCGImage:[originalImage CGImage] scale:0.125 orientation:UIImageOrientationUp];

Будет ли это делать то, что я надеюсь?

1 Ответ

2 голосов
/ 23 декабря 2011

Да, это не сработало.initWithCGImage: scale: direction изменяет только размер, указанный в свойстве size, но не выполняет никакого фактического масштабирования изображения.

В итоге я пошел по этому маршруту:
http://iosdevelopertips.com/graphics/how-to-scale-an-image-using-an-objective-c-category.html

Работает как шарм.

С состоянием

...