从较大的图像创建子图像

时间:2012-05-20 00:08:17

标签: objective-c ios jpeg

从REST端点传输大图像后,我需要将图像分成许多较小的图像块。

初始图像(例如)1024x1024,存储在NSData中;我需要创建大小为256x256的子图像(在这种情况下,将有16个子图像)。

如何做到这一点? (我没有发现任何文章甚至接近,但我认为它必须是可能的,因为大多数图像编辑软件都支持图像裁剪。)

感谢。

3 个答案:

答案 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次。

希望这有帮助

答案 1 :(得分: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];

答案 2 :(得分: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