2012-05-20 152 views
0

從REST端點傳輸大圖像後,我需要將圖像分成多個較小的圖像切片。從較大的圖像創建一個子圖像

初始圖像是(例如)1024x1024,存儲在NSData中;我需要創建大小爲256x256的子圖像(在這種情況下,將會有16個子圖像)。

這將如何完成? (我還沒有發現任何文章,甚至接近,但我認爲這一定是可能的,因爲大多數圖像編輯軟件支持圖像裁剪。)

謝謝。

回答

0
@interface UIImage (Sprite) 
- (NSArray *)spritesWithSpriteSheetImage:(UIImage *)image spriteSize:(CGSize)size; 
- (NSArray *)spritesWithSpriteSheetImage:(UIImage *)image inRange:(NSRange)range spriteSize:(CGSize)size; 
@end 




@implementation UIImage (Sprite) 

-(NSArray *)spritesWithSpriteSheetImage:(UIImage *)image spriteSize:(CGSize)size { 
    return [self spritesWithSpriteSheetImage:self inRange:NSMakeRange(0, lroundf(MAXFLOAT)) 
           spriteSize:size]; 
} 
-(NSArray *)spritesWithSpriteSheetImage:(UIImage *)image 
          inRange:(NSRange)range 
         spriteSize:(CGSize)size { 
if (!image || CGSizeEqualToSize(size, CGSizeZero) || range.length == 0) 
    return nil; 
NSLog(@"%i %i", range.location, range.length); 
CGImageRef spriteSheet = [image CGImage]; 
NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease]; 

int width = CGImageGetWidth(spriteSheet); 
int height = CGImageGetHeight(spriteSheet); 

int maxI = width/size.width; 
int startI = 0; 
int startJ = 0; 
int length = 0; 
int startPosition = range.location; 

// Extracting initial I & J values from range info 
// 
if (startPosition != 0) { 
    for (int k=1; k<=maxI; k++) { 
     int d = k * maxI; 
     if (d/startPosition == 1) { 
      startI = maxI - (d % startPosition); 
      break; 
     } 
     else if (d/startPosition > 1) { 
      startI = startPosition; 
      break; 
     } 
     startJ++; 
    } 
} 
int positionX = startI * size.width; 
int positionY = startJ * size.height; 
BOOL isReady = NO; 
while (positionY < height) { 
    while (positionX < width) { 
     CGImageRef sprite = CGImageCreateWithImageInRect(spriteSheet, CGRectMake(positionX, positionY, size.width, size.height)); 
     [tempArray addObject:[UIImage imageWithCGImage:sprite]]; 
     CGImageRelease(sprite); 
     length++; 
     if (length == range.length) { 
      isReady = YES; 
      break; 
     } 
     positionX += size.width; 
    } 
    if (isReady) 
     break; 
    positionX = 0; 
    positionY += size.height; 
} 
return [NSArray arrayWithArray:tempArray]; 
    } 
@end 
+0

我還沒有機會回到這個項目(並且可能不會花費大量時間),所以我沒有實現/測試答案。也就是說,我想給予信任,所以我將這個答案標記爲已接受。謝謝。 –

1

這是我用來在我的一些項目中裁剪圖像的功能。

- (UIImage *)cropImage:(UIImage *) image{ 
    CGRect rect = CGRectMake(0, 0, 256, 256); 
    CGImageRef subImageRef = CGImageCreateWithImageInRect(image.CGImage, rect); 
    CGRect smallBounds = CGRectMake(0, 0, CGImageGetWidth(subImageRef), CGImageGetHeight(subImageRef)); 

    UIGraphicsBeginImageContext(smallBounds.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextDrawImage(context, smallBounds, subImageRef); 
    UIImage* smallImg = [UIImage imageWithCGImage:subImageRef]; 
    UIGraphicsEndImageContext(); 

    return smallImg; 
} 

我認爲你可以從那裏罰款的方式多次調用它來裁剪你的圖片16次。

希望這有助於

+0

我想你也需要手動釋放CGImageRef(因爲你創造了它自己):CGImageRelease(subImageRef); – StephenT

1

originalImageView是一個IBOutlet中ImageView的。該圖像將被裁剪。

#import <QuartzCore/QuartzCore.h> 

這是爲了更好地理解每個切片周圍的邊界所需要的。

-(UIImage*)getCropImage:(CGRect)cropRect 
{ 
CGImageRef image = CGImageCreateWithImageInRect([originalImageView.image CGImage],cropRect); 
UIImage *cropedImage = [UIImage imageWithCGImage:image]; 
CGImageRelease(image); 
return cropedImage; 
} 

-(void)prepareSlices:(uint)row:(uint)col 
{ 
float flagX = originalImageView.image.size.width/originalImageView.frame.size.width; 
float flagY = originalImageView.image.size.height/originalImageView.frame.size.height; 

float _width = originalImageView.frame.size.width/col; 
float _height = originalImageView.frame.size.height/row; 

float _posX = 0.0; 
float _posY = 0.0; 

for (int i = 1; i <= row * col; i++) { 

    UIImageView *croppedImageVeiw = [[UIImageView alloc] initWithFrame:CGRectMake(_posX, _posY, _width, _height)]; 
    UIImage *img = [self getCropImage:CGRectMake(_posX * flagX,_posY * flagY, _width * flagX, _height * flagY)]; 
    croppedImageVeiw.image = img; 

    croppedImageVeiw.layer.borderColor = [[UIColor whiteColor] CGColor]; 
    croppedImageVeiw.layer.borderWidth = 1.0f; 

    [self.view addSubview:croppedImageVeiw]; 
    [croppedImageVeiw release]; 

    _posX += _width; 

    if (i % col == 0) { 
     _posX = 0; 
     _posY += _height; 
    } 

} 

originalImageView.alpha = 0.0; 

} 

這樣稱呼它:

[self prepareSlices:16 :16];