iOS的文件操作总结

刚做了一个 App的首页广告图片显示模块,主要涉及了相关的文件操作,在这里做一下总结:

1.首先说一下如何从网络获取图片并保存在本地:

(1) 首先用HTTP的GET方式,从服务器上获取图片

[self.article getArticle];

    self.startImageId = self.article.ID;

    self.startImageUrl = self.article.imageUrl;

    NSString *image = [self.startImageUrl substringFromIndex:33];

    NSString *imageExtension = [image pathExtension];

    NSURL *url = [[NSURL alloc] initWithString:self.startImageUrl];

    UIImage *advImage = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:url]];

这里[self.article getArticle];从服务器请求信息,并解析相关节点,并将其值保存在self.article对象中;

image为self.startImageUrl从第33个字符开始(包括第33个字符)的后面的子字符串,是图片的名字和扩展名;

[path pathExtension]得到图片的扩展名;

NSURL *url = [[NSURL alloc] initWithString:self.startImageUrl];将字符串转为NSURL格式,供后面获取图片时使用,

UIImage *advImage = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:url]];从url获取图片,注意这里的 路径(url)必须为NSURL格式。

(2) 将图片保存到document文件夹中

我先自定义了一个保存图片到本地的方法:

//将图片存到本地

-(void)saveImage:(UIImage *)image withFileName:(NSString *)imageName ofType:(NSString *)extension inD irectory:(NSString *)directoryPath

{

    if([[extension lowercaseString] isEqualToString:@"png"])

    {

        [UIImagePNGRepresentation(image) writeToFile:[directoryPath stringByAppendingPathComp onent:[NSString stringWithFormat:@"/%@.%@", imageName,@"png"]] options:NSAtom icWrite error:nil];

    }

    else if ([[extension lowercaseString] isEqualToString:@"jpg"] || [[extension lowercaseString] isEqualToString:@"jpeg"])

    {

        [UIImageJPEGRepresentation(image, 1.0) writeToFile:[directoryPath stringByAppendingPa thComponent:[NSString stringWithFormat:@"/%@.%@", imageName, @"jpg"]] options: NSAtomicWrite error:nil];

    }

}

在Iphone上有两种读取图片数据的简单方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. 
UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数.而UIImagePNGRepresentation只需要图片引用作为参数.通过在实际使用 过程中,比较发现: UIImagePNGRepresentation(UIImage* image) 要比UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的图片数据 量大很多.譬如,同样是读取摄像头拍摄的同样景色的照片, UIImagePNGRepresentation()返回的数据量大小为199K ,而 UIImageJPEGRepresentati on(UIImage* image, 1.0)返回的数据量大小只为140KB,比前者少了50多KB.如果对图片的清晰度要求不高,还可以通过设置 UIImageJPEGReprese ntation函数的第二个参数,大幅度降低图片数据量.譬如,刚才拍摄的图片, 通过调用UIImageJPEGRepresentation(UIImage* image, 1.0)读取数据时, 返回的数据大小为140KB,但更改压缩系数后,通过调用UIImageJPEGRepresentation(UIImage* image, 0.5)读取数据时,返回的数据大小只有11KB多 ,大大压缩了图片的数据量 ,而且从视角角度看,图片的质量并没有明显的降低.因此,在读取图片数据内容时,建议优先使用UIImageJPEGRepresentati on,并可根据自己的实际使用场景,设置压缩系数,进一步降低图片数据量大小.(红色字体为从转载内容

然后再需要保存图片到本地的方法中调用此方法:

//将图片存入document文件夹

  [self saveImage:advImage withFileName:@"advImage" ofType:imageExtension inDirectory:documentsDirectory];

参数withFileName:@"advImage"为保存到本地的图片的图片名字,自己定义;参数ofType:imageExtension为图片的格式,这是从网络上 图片路径的字符串中截取的(即调用字符串的pathExtension方法得到)


2.还需要获取并解析图片的Id节点,并将其值保存到本地文件中(根据Id节点值判断新获取的图片与上次从服务器获取的图片是否相同)

(1)首先在document文件夹下创建文件来存放Id节点的值:

//前两行代码找到document文件夹路径

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    //存放图片id的文件路径

    NSString *idPath = [documentsDirectory stringByAppendingPathComponent:@"imageId.txt"];

//将图片Id存入路径为idPath的文件下

  NSFileManager *fileManager = [NSFileManager defaultManager];

            [fileManager createFileAtPath:idPath contents:nil attributes:nil];

            NSMutableData *writerData = [[NSMutableData alloc]init];

            [writerData appendData:[self.startImageId dataUsingEncoding:NSUTF8StringEncoding]];

            [writerData writeToFile:idPath atomically:YES];

3. 还需要读取图片Id和图片

//读取图片id(用下面代码来从文件中获取图片Id,必须保证文件中只有图片Id这一个值

            NSData *reader = [NSData dataWithContentsOfFile:idPath];

            NSString *idString = [[NSString alloc] initWithData:reader encoding:NSUTF8StringEncoding];

//读取本地图片并显示

            NSMutableString *imageFile = [[NSMutableString alloc] initWithString:documentsDirectory];

             [imageFile appendFormat:@"/advImage.%@",imageExtension];

             UIImage *advImage = [[UIImage alloc] initWithData:[NSData dataWithContentsOfFile:imageFile]];

             self.imageView = [[UIImageView alloc] initWithImage:advImage];

             self.imageView.frame = [[UIScreen mainScreen] bounds];

             [self.view addSubview:self.imageView];







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值