ios拼图游戏(一)之分割图片

来源:互联网 发布:剑三明教脸型数据 编辑:程序博客网 时间:2024/05/17 08:46

最近在学习ios开发,在学习了一些基本知识后,想动手开发一个拼图游戏,而要实现拼图效果,首先需要分割图片,以下为分割图片的代码

//裁剪图片的函数-(UIImage*)cutImageAtSquare:(UIImage*)image Frame:(CGRect)frame{        UIImage* piePic=nil;        if(self){                //获取在_image图片的frame区域内的图片        CGImageRef imageRef=CGImageCreateWithImageInRect(image.CGImage, frame);        //创建一个基于位图frame的大小的上下文        UIGraphicsBeginImageContext(frame.size);        CGContextRef context=UIGraphicsGetCurrentContext();        //绘制截取的图片        CGContextDrawImage(context, frame, imageRef);        piePic=[UIImage imageWithCGImage:imageRef];        UIGraphicsEndImageContext();            }    return piePic;}

该函数是截取image图片frame区域内的图片,截取形状为矩形,CGImageRef是像素图像,能实现很多对图片的操作,比如缩放,截取等。

在网上查找的绘图操作都需要创建一个上下文,这个上下文究竟是做啥的,下面做了一个实验

//裁剪图片的函数-(UIImage*)cutImageAtSquare:(UIImage*)image Frame:(CGRect)frame{        UIImage* piePic=nil;        if(self){                //获取在_image图片的frame区域内的图片        CGImageRef imageRef=CGImageCreateWithImageInRect(image.CGImage, frame);        piePic=[UIImage imageWithCGImage:imageRef];            }    return piePic;}

将上下文的操作去掉,直接进行图片的截取和创建操作,运行程序后并没有明显不同,经过分析后,可能进入了一个误区,截一张图并不需要让其重新创建一个上下文(这个上下文其实是一张画布),或者说在获取或创建图片的时候imageRef和piePic已经创建了一个新的画布并进行了相应的绘图操作,所以第一部分的代码进行了两次(或三次?)创建画布的操作,也就是有一部分代码进行了无用功。以下为重新校正的代码:

//裁剪图片的函数-(UIImage*)cutImageAtSquare:<span style="font-family: Arial, Helvetica, sans-serif;">(UIImage*)image Frame:(</span><span style="font-family: Arial, Helvetica, sans-serif;">CGRect)frame{</span>        UIImage* piePic=nil;        if(self){        //方法一//        //获取在_image图片的frame区域内的图片//        CGImageRef imageRef=CGImageCreateWithImageInRect(image.CGImage, frame);//        piePic=[UIImage imageWithCGImage:imageRef];
//<span style="white-space:pre"></span>方法二        //获取截取区域大小        CGSize sz=frame.size;        //获取截取区域坐标        CGPoint origin=frame.origin;        //创建sz大小的上下文,背景是否透明:NO,缩放尺寸:0表示不缩放        UIGraphicsBeginImageContextWithOptions(sz, NO, 0);        //移动坐标原点绘制图片,由于上下文坐标系与图片自身坐标系是相反的,所以绘制坐标需要取反        [image drawAtPoint:CGPointMake(-origin.x, -origin.y)];        //获取绘制后的图片        piePic=UIGraphicsGetImageFromCurrentImageContext();        //绘制结束        UIGraphicsEndImageContext();            }    return piePic;}

虽然方法一代码量小,且简单,但并不能实现复杂的截图,所以建议使用方法二。

总结完毕,如有错误请指正,谢谢


0 0
原创粉丝点击