Любые предложения о том, как масштабировать полноэкранное изображение iPad без потери качества изображения? - PullRequest
3 голосов
/ 15 марта 2012

Вот что я пытаюсь достичь:

Полноэкранное изображение животного (векторная графика, а не фотография) на iPad.Когда вы нажимаете на часть тела, скажем, на ухо, изображение увеличивается и увеличивается на ухе, и текст отображается вокруг уха.Нажмите кнопку уменьшения масштаба, и вы вернетесь к полному снимку тела.Я знаю, как запрограммировать масштабирование и перемещение, но я не знаю, как лучше всего подходить к качеству изображения.Изображение 1024x768 необходимо увеличить на 400%, чтобы получить нужный эффект кадрирования.Очевидно, что для нового iPad это изображение размером 1024x768 уже начало бы удваиваться и оттуда должно увеличиться на 400%.

Первоначальная склонность - взять изображение 4096x3072 и начать с его уменьшения до 1/4, а затем при увеличении до 400% качество изображения не ухудшается.Это одно изображение использует почти 70 МБ памяти, что ожидается, и я понимаю, почему это происходит, но, очевидно, это не сработает, когда это только одна часть более крупного приложения.Не говоря уже о том, что произойдет с @ 2x версией для сетчатки.

Есть ли у кого-нибудь какие-либо предложения о том, как добиться этого эффекта без такой нагрузки на устройство?Похоже, что устройства iOS не могут работать с векторными изображениями, только растровые.Из-за уровня детализации, которого я хотел бы достичь, я не могу просто увеличить масштаб и справиться с потерей качества.Это даже выполнимо или я должен найти другой подход?Я работаю с XCode 4.3.1 и Cocos2d v 1.0.1, но могу заглянуть в v2.0, если это решит мою проблему.

Изображение всего тела моего супер-удивительного лемура (у меня есть графический дизайнер длясделайте это позже): enter image description here

Увеличенное изображение на ухе:

enter image description here

Как только наш дизайнер поработает над этим, я представлю что-то еще в этом направлении (изображение из поиска картинок Google, а не моя работа, и, надеюсь, наша не будет такой сварливой):

enter image description here

Ответы [ 4 ]

3 голосов
/ 15 марта 2012

Так как это векторная графика, разве вы не можете просто рассчитать необходимое подизображение на лету?

Это даст вам наилучшее качество, и вам не придется беспокоиться о массивных 4X изображениях или минификации.Артефакты.

Эта статья должна помочь: http://rdsquared.wordpress.com/2012/01/10/svg-to-coregraphics-conversion/

Если вы не используете SVG, возможно, это даст вам некоторые идеи.

3 голосов
/ 15 марта 2012

Возможно, вы можете использовать несколько изображений.Получите полноэкранное полностью уменьшенное изображение.Когда пользователь решает увеличить какую-то часть, отобразите еще одно полноэкранное изображение увеличенной части.Вы можете анимировать переход (постепенное увеличение / уменьшение) таким образом, чтобы он был достаточно плавным.

Это предполагает ограниченные возможности масштабирования.Например, пользователь может увеличить n различий на животном.

0 голосов
/ 30 августа 2013

Вы можете использовать функцию CGContextScaleCTM в среде Quartz 2D для плавного масштабирования изображений высокого разрешения.

Вы можете найти хороший пример приложения Apple в URL, указанном ниже. MoveMe_APLMoveMeView_m

TiledImageView.h

#import <UIKit/UIKit.h>

@interface TiledImageView : UIView {
    CGFloat imageScale;
    UIImage* image;
    CGRect imageRect;
}
@property (retain) UIImage* image;

-(id)initWithFrame:(CGRect)_frame image:(UIImage*)_image scale:(CGFloat)_scale;

@end

TiledImageView.m

#import "TiledImageView.h"
#import <QuartzCore/QuartzCore.h>

@implementation TiledImageView

@synthesize image;

// Set the layer's class to be CATiledLayer.
+ (Class)layerClass {
    Return [CATiledLayer class];
}

- (void)dealloc {
    [image release];
    //--
    [super dealloc];
}

// Create a new TiledImageView with the desired frame and scale.
-(id)initWithFrame:(CGRect)_frame image:(UIImage*)_image scale:(CGFloat)_scale {
    if ((self = [super initWithFrame:_frame])) {
        self.image = _image;
        imageRect = CGRectMake(0.0f, 0.0f, CGImageGetWidth(image.CGImage), CGImageGetHeight(image.CGImage));
        imageScale = _scale;
        CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
        // levelsOfDetail and levelsOfDetailBias determine how
        // the layer is rendered at different zoom levels.  This
        // only matters while the view is zooming, since once the 
        // the view is done zooming a new TiledImageView is created
        // at the correct size and scale.
        tiledLayer.levelsOfDetail = 4;
        tiledLayer.levelsOfDetailBias = 4;
        tiledLayer.tileSize = CGSizeMake(512.0, 512.0); 
    }
    return self;
}

-(void)drawRect:(CGRect)_rect {
    CGContextRef context = UIGraphicsGetCurrentContext();    
    CGContextSaveGState(context);
    // Scale the context so that the image is rendered 
    // at the correct size for the zoom level.
    CGContextScaleCTM(context, imageScale,imageScale);  
    CGContextDrawImage(context, imageRect, image.CGImage);
    CGContextRestoreGState(context);    
}
@end
0 голосов
/ 17 марта 2012

Еще одно предложение: используйте Quartz 2d CGContextRef

1) Сохраните вашу графику в формате PDF. это было бы маленьким, поскольку это вектор

2) Откройте PDF, как описано здесь: Руководство по программированию в Quartz 2D

3) создать CGBitmapContext и отобразить там необходимую часть pdf

4) создать CCTexture2D из CGBitmapContext - посмотрите здесь: http://www.cocos2d -iphone.org / forum / topic / 30152? Ответы = 6 # post-148782 или изучите CCTexture2D.m -initWithImage

5) используйте его.

...