如何以编程方式将图像裁剪成碎片

时间:2011-01-20 03:44:49

标签: iphone core-graphics

我需要以编程方式将图像分成9个部分。有关如何做到这一点的任何建议?

4 个答案:

答案 0 :(得分:13)

下面的代码也是一种解决方案,可以检测被轻拍的图片。我们的想法是采用UIImage并使用CGImageCreateWithImageInRect来裁剪碎片。从裁剪的部分创建一个新的UIImage并将其放在UIImageView中。为了使轻敲手势起作用,我必须将UIImageView放在UIView中。最后,提供手势和唯一标记,以便在点击时识别该片段。

- (void)loadView {
    UIView* root = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    UIImage* whole = [UIImage imageNamed:@"whole.jpg"]; //I know this image is 300x300

    int partId = 0;
    for (int x=0; x<=200; x+=100) {
        for(int y=0; y<=200; y+=100) {
            CGImageRef cgImg = CGImageCreateWithImageInRect(whole.CGImage, CGRectMake(x, y, 100, 100));
            UIImage* part = [UIImage imageWithCGImage:cgImg];
            UIImageView* iv = [[UIImageView alloc] initWithImage:part];

            UIView* sView = [[UIView alloc] initWithFrame:CGRectMake(200-x, 200-y, 100, 100)];
            [sView addSubview:iv];
            [iv release];

            UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                                  action:@selector(tap:)];
            tap.numberOfTapsRequired = 1;
            [sView addGestureRecognizer:tap];
            [tap release];

            sView.tag = partId;

            [root addSubview:sView];
            [sView release];
            partId++;
            CGImageRelease(cgImg);
        }
    }

    self.view = root;
}

- (void)tap:(UITapGestureRecognizer*)gesture
{
    NSLog(@"image tap=%d", gesture.view.tag);
}

答案 1 :(得分:6)

有很多方法可以对图像进行切片和切块,但这里有一个。它使用Quartz将图像切割成9个相等大小的分数。请注意,它不处理旋转的图像(我的意思是图像与imageOrientation!= 0),但它应该让你开始:

+(NSArray *)splitImageInTo9:(UIImage *)im{
    CGSize size = [im size];
    NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:9];
    for (int i=0;i<3;i++){
        for (int j=0;j<3;j++){
            CGRect portion = CGRectMake(i * size.width/3.0, j * size.height/3.0, size.width/3.0, size.height/3.0);
            UIGraphicsBeginImageContext(portion.size);
            CGContextRef context = UIGraphicsGetCurrentContext();
            CGContextScaleCTM(context, 1.0, -1.0);
            CGContextTranslateCTM(context, 0, -portion.size.height);
            CGContextTranslateCTM(context, -portion.origin.x, -portion.origin.y);
            CGContextDrawImage(context,CGRectMake(0.0, 0.0,size.width,  size.height), im.CGImage);
            [arr addObject:UIGraphicsGetImageFromCurrentImageContext()];
            UIGraphicsEndImageContext();


        }
    }
    return [arr autorelease];

}

输出将是9个图像的数组,每个图像的大小(/ 3,高度/ 3)

答案 2 :(得分:1)

根据参数执行代码切片图像,添加边框并显示:

-(NSMutableArray *)getImagesFromImage:(UIImage *)image withRow:(NSInteger)rows           withColumn:(NSInteger)columns{
  NSMutableArray *images = [NSMutableArray array];
  CGSize imageSize = image.size;
  CGFloat xPos = 0.0, yPos = 0.0;
  CGFloat width = imageSize.width/rows;
  CGFloat height = imageSize.height/columns;
  for (int y = 0; y < columns; y++) {
    xPos = 0.0;
    for (int x = 0; x < rows; x++) {

        CGRect rect = CGRectMake(xPos, yPos, width, height);
        CGImageRef cImage = CGImageCreateWithImageInRect([image CGImage],  rect);

        UIImage *dImage = [[UIImage alloc] initWithCGImage:cImage];
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(x*width, y*height, width, height)];
        [imageView setImage:dImage];
        [imageView.layer setBorderColor:[[UIColor blackColor] CGColor]];
        [imageView.layer setBorderWidth:1.0];
        [self.view addSubview:imageView];
        [images addObject:dImage];
        xPos += width;
    }
    yPos += height;
}
return images;
}

项目下载链接:https://github.com/bpolat/Image-Slicer

样本用法和结果:

[self getImagesFromImage:[UIImage imageNamed:@“1.png”] withRow:4 withColumn:4];

enter image description here

答案 3 :(得分:0)

如果你想组织图像的各个部分,你需要在最终视图中使用一些UIImageView ..只需看看这段代码:

    UIImage* whole = [UIImage imageNamed:@"permanent_cosmetics_pretty.jpg"];
    int partId = 0;     
    for (int x=0; x<=300; x+=100) {
      for(int y=0; y<=300; y+=100) { 

        CGImageRef cgImg = CGImageCreateWithImageInRect(whole.CGImage, CGRectMake(x, y, 100, 100));
        UIImage* part = [UIImage imageWithCGImage:cgImg];           
        UIImageView* iv = [[UIImageView alloc] initWithImage:part];                         

        switch (partId) {
            case 0:
                self.part1.image=iv.image;
                break;
            case 1:
                self.part2.image=iv.image;
                break;
            case 2:
                self.part3.image=iv.image;
                break;
            case 3:
                self.part4.image=iv.image;
                break;
            case 4:
                self.part5.image=iv.image;
                break;
            case 5:
                self.part6.image=iv.image;
                break;
            case 6:
                self.part7.image=iv.image;
                break;
            case 7:
                self.part8.image=iv.image;
                break;
            case 8:
                self.part9.image=iv.image;
                break;
            case 9:
                self.part10.image=iv.image;
                break;
            case 10:
                self.part11.image=iv.image;
                break;
            case 11:
                self.part12.image=iv.image;
                break;
            default:
                break;
        }               
        [iv release];               
        partId++;
        NSLog(@"part id = %d",partId);
        }
   }

  [self.view addSubview:self.finalView];