iOS图片处理

我们常用的图片格式可以分为bmp,jpg,png,gif,webp,其中bmp常用语安卓端开发,iOS常用的是jpg和png,苹果默认是不支持gif图片的,我们拉取gif得到的是一帧帧的图片但是我们可以在工程中用代码生成gif图片,webp是google推出的一种新的图片格式,它的有点是可以将相同质量的图片大小缩减50%甚至更多,webp算法比较复杂,消耗内存较多,但基于其存储占用优势,以后可能会成为主流格式。

下边先从jpg和png谈起,iOS中我们常用png,因为清晰度相同的两张图片,png是无损的,所占空间更小。

一、png和jpg相互转化

//jpg转化png
-(void)jpgToPng{
    UIImage * image = [UIImage imageNamed:@"1.jpg"];

    NSData * data = UIImagePNGRepresentation(image);

    UIImage * pngImage =[UIImage imageWithData:data];

    UIImageWriteToSavedPhotosAlbum(pngImage, nil, nil, nil);

}

//jpg转化jpg
-(void)jpgTojpg{
    UIImage * image = [UIImage imageNamed:@"1.jpg"];
    //后一个参数越小,则生成的图片越小,越模糊
    NSData * data = UIImageJPEGRepresentation(image, 0.5);

    UIImage * jpgImage =[UIImage imageWithData:data];

    UIImageWriteToSavedPhotosAlbum(jpgImage, nil, nil, nil);

}

//png转化png
-(void)pngToJpg{
    UIImage * image = [UIImage imageNamed:@"2.png"];

    NSData * data = UIImageJPEGRepresentation(image, 0.5);

    UIImage * jpgImage =[UIImage imageWithData:data];

    UIImageWriteToSavedPhotosAlbum(jpgImage, nil, nil, nil);

}

二、gif图片分解

gif图片分解的步骤为

1.拿到gif数据

2.分帧

3.将单帧数据转化为图片

4.保存

首先我们需要先引入头文件


#import <ImageIO/ImageIO.h>

#import <MobileCoreServices/MobileCoreServices.h>

//分解gif
-(void)deCompositionGif{
 //读取gif数据
    NSString * gifResource = [[NSBundle mainBundle]pathForResource:@"1.gif" ofType:nil];

    NSData * data = [NSData dataWithContentsOfFile:gifResource];

   CGImageSourceRef  source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);

   //获取gif帧数
    size_t count = CGImageSourceGetCount(source);
    NSLog(@"%ld",count);
    //定义数组,保存单帧图片

    NSMutableArray * ImageArr = [NSMutableArray array];

//遍历取出每一帧
    for (size_t i = 0; i<count; i++) {

        CGImageRef imageRef = CGImageSourceCreateImageAtIndex(source, i, NULL);

        //将单帧数据转化为uiimag   scale 图片物理尺寸与屏幕的比例    orientation 图片的方向
        UIImage * image = [UIImage imageWithCGImage:imageRef scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
        //保存
        [ImageArr addObject:image];
        //释放
        CGImageRelease(imageRef);
    }
    CFRelease(source);
    //单帧图片保存
    int i  = 0 ;
    for (UIImage * image in ImageArr) {
        i++;
        NSData *  data = UIImagePNGRepresentation(image);

        NSArray * path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString * gifPath = path[0];

        NSString * pathNumber = [gifPath stringByAppendingString:[NSString stringWithFormat:@"%d.png",i]];
        NSLog(@"%@",pathNumber);
        [data writeToFile:pathNumber atomically:YES];
    }

}

三.gif展示

 UIImageView * imageView3 =[[UIImageView alloc]initWithFrame:CGRectMake(10, 100, 200, 200)];
    [self.view addSubview:imageView3];
    NSMutableArray * arr = [[NSMutableArray alloc]init];

    for (int i = 1; i<9; i++) {
        UIImage * image = [UIImage imageNamed:[NSString stringWithFormat:@"Documents%d",i]];

        [arr addObject:image];
    }
    //设置播放属性
    [imageView3 setAnimationImages:arr];
    [imageView3 setAnimationDuration:2];
    [imageView3 setAnimationRepeatCount:10];
    [imageView3 startAnimating];

四.由帧图片生成gif。

//创建gif图片
-(void)creatGif{

    //获取gif数据
    NSMutableArray * image =[[NSMutableArray alloc]initWithObjects:[UIImage imageNamed:@"Documents1"],[UIImage imageNamed:@"Documents2"],[UIImage imageNamed:@"Documents3"],[UIImage imageNamed:@"Documents4"],[UIImage imageNamed:@"Documents5"],[UIImage imageNamed:@"Documents6"], nil];
//创建gif文件
    NSArray * document = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString * documentStr = [document objectAtIndex:0];

    NSFileManager * manager = [NSFileManager defaultManager];
    NSString * testDic = [documentStr stringByAppendingString:@"/gif"];
    NSString * path = [testDic stringByAppendingString:@"test.gif"];
    [manager createDirectoryAtPath:testDic withIntermediateDirectories:YES attributes:nil error:nil];
//配置属性
    CGImageDestinationRef destion;
    //将path映射成 CFURLRef 对象
    CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)path, kCFURLPOSIXPathStyle, false);

    //url 路径 kUTTypeGIF目标类型
  destion  =    CGImageDestinationCreateWithURL(url, kUTTypeGIF, image.count, nil);

    NSDictionary * frameDic = [NSDictionary dictionaryWithObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:0.3], (NSString *)kCGImagePropertyGIFDelayTime,nil] forKey:(NSString *)kCGImagePropertyGIFDelayTime];

    NSMutableDictionary * gifParmDic = [NSMutableDictionary dictionaryWithCapacity:3];

    [gifParmDic setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCGImagePropertyGIFHasGlobalColorMap];

    [gifParmDic setObject:(NSString *)kCGImagePropertyColorModelRGB forKey:(NSString *)kCGImagePropertyColorModel];
    [gifParmDic setObject:[NSNumber numberWithInt:8] forKey:(NSString *)kCGImagePropertyDepth];
    [gifParmDic setObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount];
    NSDictionary * gifProperty = [NSDictionary dictionaryWithObject:gifParmDic forKey:(NSString *)kCGImagePropertyGIFDictionary ];
    //单帧图片添加到gif
    for (UIImage * Dimage  in  image) {
        CGImageDestinationAddImage(destion,Dimage.CGImage, (__bridge CFDictionaryRef)frameDic);

           }
    CGImageDestinationSetProperties(destion, (__bridge CFDictionaryRef)gifProperty);

    CGImageDestinationFinalize(destion);

    CFRelease(destion);

}
时间: 2024-10-05 18:53:34

iOS图片处理的相关文章

ios图片拉伸两种方法

ios图片拉伸两种方法 UIImage *image = [UIImage imageNamed:@"qq"]; 第一种: // 左端盖宽度 NSInteger leftCapWidth = image.size.width * 0.5f; // 顶端盖高度 NSInteger topCapHeight = image.size.height * 0.5f; // 重新赋值 image = [image stretchableImageWithLeftCapWidth:leftCapW

IOS图片拉伸技巧

IOS 图片拉伸技巧 对于有些图标等按钮 在美工设计的按钮下可以通过拉伸效果处理所需效果,最熟悉的莫过于微信聊天的 椭圆背景,也是通过这个这个原理进行背景图片.  如对该图片拉伸,如何操作? 首先找到要拉伸的部分,很明显 两侧椭圆是不变 要拉伸的是中间部分,如何指定中间部位,先看下图 指定这4个宽度后 会形成黑色模块 直白点就是 这块内容就是拉伸后中间那块不断填充的部分 具体代码: 1 UIImage* img=[UIImage imageNamed:@"2.png"];//原图2 U

IOS 图片轮播实现原理 (三图)

IOS 图片轮播实现原理的一种 图片轮播所要实现的是在一个显示区域内通过滑动来展示不同的图片. 当图片较少时我们可以采用在滚动视图上添加很多张图片来实现. 但是如果图片数量较多时,一次性加载过多图片会浪费内存,影响性能. 因此我们要采取适当地方法来实现图片的轮播. 下面我们只是简单的介绍很多方法中的一种简单的实现原理. 一 二 三 四 五 六 七

ios图片拉伸

 button.png,尺寸为:24x60 现在我们把它用作为按钮背景,按钮尺寸是150x50: // 得到view的尺寸 CGSize viewSize = self.view.bounds.size; // 初始化按钮 UIButton *button = [[UIButton alloc] init]; // 设置尺寸 button.bounds = CGRectMake(0, 0, 150, 50); // 设置位置 button.center = CGPointMake(viewSiz

ios图片瀑布流代码

ios瀑布流,实现简单的瀑布流视图布局,可以显示网络图片,下拉刷新,上拉加载更多. 下载:http://www.huiyi8.com/sc/9087.html ios图片瀑布流代码,布布扣,bubuko.com

iOS图片模糊效果

加入  CoreImage.framework  CoreGraphic.framework 等库 在使用时引入:#import <Accelerate/Accelerate.h> ,支持iOS 5.0 及以上. -(void)show { UIImage* img = [self getBlurImage:[UIImage imageNamed:@"Default-568h.png"]]; [_bgImageView setImage:img]; } -(UIImage*

ios 图片裁剪

/** *  图片裁剪 裁剪原理: 先在控制器上确定一个区域,然后再把要把需要裁剪的图片该区域上面,超出区域的图片都不显示 * *  @param rect */-(void) drawRect:(CGRect)rect{    CGContextRef ref = UIGraphicsGetCurrentContext();        // 首先画圆    CGContextAddEllipseInRect(ref, CGRectMake(100, 100, 100, 100));    

iOS 图片拉伸 resizableImageWithCapInsets

UIImage *image =  [[UIImage imageNamed:@"test.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)]; 其中Insets这个参数的格式是(top,left,bottom,right),从上.左.下.右分别在图片上画了一道线,这样就给一个图片加了一个框. 只有在框里面的部分才会被拉伸,而框外面的部分则不会改变. 4个参数是上边界,左边界,下边界,右边界距离,也可以为负

IOS 图片转换二进制 二进制转换为图片

//类方法 图片 转换为二进制 +(NSData *)Image_TransForm_Data:(UIImage *)image { NSData *imageData = UIImageJPEGRepresentation(image , 0.5); //几乎是按0.5图片大小就降到原来的一半 比如这里 24KB 降到11KB return imageData; } //调用方法举例 -(void)viewWillAppear:(BOOL)animated { [self Read_Image

实现iOS图片等资源文件的热更新化(五): 一个简单完整的资源热更新页面

简介 一个简单的关于页面,有一个图片,版本号,App名称等,着重演示各个系列的文章完整集成示例. 动机与意义 这是系列文章的最后一篇.今天抽空写下,收下尾.文章本身会在第四篇的基础上,简单扩充下代码,实现在线下载与重置更改的功能. 如果能较为仔细地阅读前四篇文章,第五篇给出的示例,应当是可以理解为无足轻重的.但是,大多数时候,我们更多的可能只是需要一个简易的解决方案,就是那种拿来就可以用的东西,那种我们需要先能看到一个简要的示例来看下效果再解决是否再继续阅读的方案.如此,对于很久以后,由于各种原