UIImage 图片处理:截图,缩放,设定大小,存储

图片的处理大概就分 截图(capture), 缩放(scale),设定大小(resize), 存储(save)

这几样比较好处理, 另外还有滤镜,擦试等, 以后再说

在这个Demo code, 我写了几个方法


1.等比率缩放

- (UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize

{

    UIGraphicsBeginImageContext(CGSizeMake(image.size.width * scaleSize, image.size.height * scaleSize);

                                [image drawInRect:CGRectMake(0, 0, image.size.width * scaleSize, image.size.height * scaleSize)];

                                UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();

                                UIGraphicsEndImageContext();

                                

                                return scaledImage;

                                }

                                

 2.自定长宽

- (UIImage *)reSizeImage:(UIImage *)image toSize:(CGSize)reSize

    {

        UIGraphicsBeginImageContext(CGSizeMake(reSize.width, reSize.height));

        [image drawInRect:CGRectMake(0, 0, reSize.width, reSize.height)];

        UIImage *reSizeImage = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        

        return reSizeImage;

    }

                                

 3.处理某个特定View

只要是继承UIViewobject 都可以处理 必须先import QuzrtzCore.framework

                                

 -(UIImage*)captureView:(UIView *)theView

    {

        CGRect rect = theView.frame;

        UIGraphicsBeginImageContext(rect.size);

        CGContextRef context = UIGraphicsGetCurrentContext();

        [theView.layer renderInContext:context];

        UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        

        return img;

    }

                                

  4.储存图片

储存图片这里分成储存到app的文件里, 储存到手机的图片库里

1) 储存到app的文件里

    NSString *path = [[NSHomeDirectory()stringByAppendingPathComponent:@"Documents"]stringByAppendingPathComponent:@"image.png"];

    [UIImagePNGRepresentation(image) writeToFile:pathatomically:YES];

    这样就把你要处理的图片, image.png这个档名存到app home底下的Documents目录里

2)储存到手机的图片库里

    CGImageRef screen = UIGetScreenImage();

    UIImage* image = [UIImage imageWithCGImage:screen];

    CGImageRelease(screen);

    UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);

    UIGetScreenImage()原本是private(私有)api, 用来截取整个画面

    不过SDK 4.0apple就开放了

    另外储存到手机的图片库里, 必须在实机使用, 模拟器无法使用

    

    以下代码用到了Quartz FrameworkCore Graphics Framework. workspaceframework目录里添加这两个framework.UIKit里,图像类UIImageCGImageRef的画图操作都是通过Graphics Context来完成。Graphics Context封装了变换的参数,使得在不同的坐标系里操作图像非常方便。缺点就是,获取图像的数据不是那么方便。下面会给出获取数据区的代码。

    

    

    

    UIView中获取图像相当于窗口截屏。ios提供全局的全屏截屏函数UIGetScreenView(). 如果需要特定区域的图像,可以crop一下。

    CGImageRef screen = UIGetScreenImage();

    UIImage* image = [UIImage imageWithCGImage:screen];

    对于特定UIView的截屏,可以把当前Viewlayer,输出到一个ImageContext中,然后利用这个ImageContext得到UIImage

    -(UIImage*)captureView: (UIView *)theView

    {

        CGRect rect = theView.frame;

        UIGraphicsBeginImageContext(rect.size);

        CGContextRef context =UIGraphicsGetCurrentContext();

        [theView.layer renderInContext:context];

        UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        

        return img;

    }

    如果需要裁剪制定区域,可以path & clip,以下例子是建一个200x200的图像上下文,再截取出左上角

    UIGraphicsBeginImageContext(CGMakeSize(200,200));

    CGContextRefcontext=UIGraphicsGetCurrentContext();

    UIGraphicsPushContext(context);

    // ...把图写到context中,省略[indent]CGContextBeginPath();

    CGContextAddRect(CGMakeRect(0,0,100,100));

    CGContextClosePath();[/indent]CGContextDrawPath();

    CGContextFlush(); // 强制执行上面定义的操作

    UIImage* image = UIGraphicGetImageFromCurrentImageContext();

    UIGraphicsPopContext();

    存储图像分为存储到home目录文件和图片库文件。存储到目录文件是这样

    NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"image.png"];

    [UIImagePNGRepresentation(image) writeToFile:path atomically:YES];

    若要存储到图片库里面

    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

    

    UImage封装了CGImage, 互相转换很容易

    UIImage* imUI=nil;

    CGImageRef imCG=nil;

    imUI = [UIImage initWithCGImage:imCG];

    imCG = imUI.CGImage;

    CGImage上获取图像数据区,在apple dev上有QA, 不过好像还不支持ios

    下面给出一个在ios上反色的例子

    -(id)invertContrast:(UIImage*)img

    {

        CGImageRef inImage = img.CGImage;

        CGContextRef ctx;

        CFDataRef m_DataRef;

        m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage));

        

        int width = CGImageGetWidth( inImage );

        int height = CGImageGetHeight( inImage );

        

        int bpc = CGImageGetBitsPerComponent(inImage);

        int bpp = CGImageGetBitsPerPixel(inImage);

        int bpl = CGImageGetBytesPerRow(inImage);

        

        UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef);

        int length = CFDataGetLength(m_DataRef);

        

        NSLog(@"len %d", length);

        NSLog(@"width=%d, height=%d", width, height);

        NSLog(@"1=%d, 2=%d, 3=%d", bpc, bpp,bpl);

        

        for (int index = 0; index < length; index += 4)

        { 

            m_PixelBuf[index + 0] = 255 - m_PixelBuf[index + 0];// b

            m_PixelBuf[index + 1] = 255 - m_PixelBuf[index + 1];// g

            m_PixelBuf[index + 2] = 255 - m_PixelBuf[index + 2];// r

        }

        

        ctx = CGBitmapContextCreate(m_PixelBuf, width, height, bpb, bpl, CGImageGetColorSpace( inImage ), kCGImageAlphaPremultipliedFirst );

        CGImageRef imageRef = CGBitmapContextCreateImage (ctx);

        UIImage* rawImage = [UIImage imageWithCGImage:imageRef];

        CGContextRelease(ctx);

        return rawImage;

    }

    

    得到图像数据区后就可以很方便的实现图像处理的算法。下面给显示图像数据区的方法,也就是unsigned char*转为graphics context或者UIImage或和CGImageRef

    CGContextRef ctx = CGBitmapContextCreate(pixelBuf,width,height, bitsPerComponent,bypesPerLine, colorSpace,kCGImageAlphaPremultipliedLast );

    CGImageRef imageRef = CGBitmapContextCreateImage (ctx);

    UIImage* image = [UIImage imageWithCGImage:imageRef];

    NSString* path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"ss.png"];

    [UIImagePNGRepresentation(self.image) writeToFile:path atomically:YES];

    CGContextRelease(ctx);

    关于图像获取方面,在这里应该都覆盖到了,不正之处,欢迎指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章