1

UIImage をサブクラス化して UIImageExtra を作成しました。UIImageExtra内に、UIImageのサイズを調整するadjustForResolutionというメソッドがあります。ただし、UIImageExtra を返したいです。変換する必要があることは理解していますが、その方法が正確にはわかりません。基本的に、UIImageExtra のサイズを変更すると、UIImage になります。

ここに私の UIImageExtra クラスがあります:

    #import "UIImageExtra.h"
#import <objc/runtime.h>
#import "UIApplication+AppDimensions.h"

#define kOriginData     @"originData"

@implementation UIImageExtra

@synthesize originData;

+ (UIImageExtra *)imageNamed:(NSString *)imageName origin:(NSValue *)originData {
    NSString *path = [[NSBundle mainBundle] pathForResource:imageName ofType:@""];
    UIImageExtra *imageExtra = [[UIImageExtra alloc] initWithContentsOfFile:path];
    imageExtra.originData = originData;
    return imageExtra;
}

- (id)initWithContentsOfFile:(NSString *)path {
    self = [super initWithContentsOfFile:path]; 
    if (self) {
        self = [self adjustForResolution];
    }
    NSLog(@"Image description: %@", [self description]);
    return self;
}


- (id)adjustForResolution {
    //All images are sized for ipad3 (2048 x 1536), so determine scale factor by ratio
    CGSize screenSize = [UIApplication currentSize];
    double scalefactor = screenSize.width/2048;
    CGSize newSize = CGSizeMake(self.size.width*scalefactor, self.size.height*scalefactor);
    UIImage *scaledImage = [self imageByScalingAndCroppingForSize:newSize];
    return scaledImage;
}

- (id)imageByScalingAndCroppingForSize:(CGSize)targetSize
{
   //returns resized image
}

@end
4

2 に答える 2

1

UIImage のクラス拡張を作成してサイズ変更を処理し、NSObject から継承して 2 つの UIImage を保持する新しいクラスを作成する方が簡単でしょうか.1 つは元の UIImage で、もう 1 つはサイズ変更されたコピーですか?

UIImage+Extra.h:

#import <UIKit/UIKit.h>

@interface UIImage (Extra)

-(void)adjustForResolution;
-(void)imageByScalingAndCroppingForSize:(CGSize)targetSize;

@end

UIImage+Extra.m:

#import "UIImage+Extra.h"

@implementation UIImage (Extra)


- (void)adjustForResolution {
      //All images are sized for ipad3 (2048 x 1536), so determine scale factor by ratio
      CGSize screenSize = [UIApplication currentSize];
      double scalefactor = screenSize.width/2048;
      CGSize newSize = CGSizeMake(self.size.width*scalefactor,self.size.height*scalefactor);
      [self imageByScalingAndCroppingForSize:newSize];

}

- (id)imageByScalingAndCroppingForSize:(CGSize)targetSize
{

      //instead of doing work to another object and returning it... Do it to self (UIimage)

}

@end

次に、カスタム NSObject クラスで、init は次のようになります。

#import "UIImage+Extra"

...

//initialisation 

if (self) {

     originalImage = [UIImage imageNamed:@"theimage.png"];
     resizedImage = [UIImage imageNamed:@"theimage.png"];
     [resizedImage adjustForResolution];

}

書いただけなので誤字脱字あるかもしれませんが参考になれば幸いです

于 2012-05-02T20:59:36.983 に答える
0

これがあなたがやりたいことだと思います:

- (id)initWithContentsOfFile:(NSString *)path {
    CGSize screenSize = [UIApplication currentSize];
    double scalefactor = screenSize.width/2048;
    if (scalefactor < 1) {
        UIImage *img = [UIImage imageWithContentsOfFile:path];
        CGSize newSize = CGSizeMake(img.size.width*scalefactor, img.size.height*scalefactor);
        UIGraphicsBeginImageContext(newSize);
        CGContextRef c = UIGraphicsGetCurrentContext();

        [img drawInRect:(CGRect){CGPointZero, newSize}];
        CGImageRef scaledImage = CGBitmapContextCreateImage(c);
        UIGraphicsEndImageContext();
        self = [super initWithCGImage:scaledImage];
        CGImageRelease(scaledImage);
    }else {
        self = [super initWithContentsOfFile:path];
    }
    return self;
}

initWithCGImage の代わりに contensOfFile を使用しないことの欠点は、結果のイメージがパージ可能でないため、遅かれ早かれメモリの問題が発生することです。

于 2012-05-03T13:10:34.700 に答える