刚做了一个 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];