iOS网络大图片缩放

一、本地大高清图

首先我们是本地的一张大图,而你需要放置图片的位置只有几十个像素。要不选择让美工给你缩放图片,否则就可以直接用附录中代码缩放。

Tip:缩放后的图片缓存起来,因为是本地图片,是你常用到的。

二、网络图片

新浪微博的图片是可以根据图片的大小进行预览区域大小的设置,如果固定区域大小让系统layer给你缩放图片、绘制。其一很耗费cpu,其次也就没那么多用户喜欢上他了。

既然是网络图片,那么就在iOS中需要用到网络请求来请求,那么接下来可能会对你有所启发。

思路:图片就是文件,文件就有文件头,一般的文件头里面都会有文件的一些常规信息,可能也包括图片的大小。

苹果提供的NSURLSessionData* API里边:

//返回header头部的API

//利用对象转换就可以获取到请求头header里边的allHeaderFields 

 //NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;

   // httpResponse.allHeaderFields

- (void)URLSession:(NSURLSession*)session dataTask:(NSURLSessionDataTask*)dataTask

                                 didReceiveResponse:(NSURLResponse*)response

                                  completionHandler:(void(^)(NSURLSessionResponseDispositiondisposition))completionHandler;


//返回具体图片的data数据

- (void)URLSession:(NSURLSession*)session dataTask:(NSURLSessionDataTask*)dataTask

                                     didReceiveData:(NSData*)data;

这样的话我就可以利用header里边的图片大小信息,来预设置图片的size。再来加载图片。

这时候可能你会有点毛了。我要看的是图片缩放不是新浪的需求。- _ ->

淡定些~

在返回具体图片的data数据,我们可以直接调动附录中的代码直接缩放成自己要的比例。

当然啦,也有那种量特别大,你会觉得比较卡顿。在调用缩放直接你开辟个线程,比如这样    [selfperformSelectorInBackground:SELwithObject:@""]。

PS:有大神博客中提到:在下载完成后,最好是用background thread,缩放一次,然后在UIImageView中使用缩放后的图片.但笔主实在现在没有查到background thread代码如何书写。有知道的兄弟姐妹些,希望可以不吝赐教啊。(-_ - )!!渴望脸

最后再提两点:

(1) Cache, Cache, 还是Cache!  缓存你缩放了的缩列图。

 (2) 如果实在还想用 NSURLConnection   其中也有对应的API 

- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response 

- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data 

三、附录:缩放图片代码

/**  *  调整图片尺寸和大小  *

 *  @param sourceImage  原始图片

 *  @param maxImageSize 新图片最大尺寸

 *  @param maxSize      新图片最大存储大小  

 *  @return 新图片imageData  

*/

- (NSData*)reSizeImageData:(UIImage*)sourceImage maxImageSize:(CGFloat)maxImageSize maxSizeWithKB:(CGFloat) maxSize{

    if(maxSize <=0.0) maxSize =1024.0;  

  if(maxImageSize <=0.0) maxImageSize =1024.0;     //先调整分辨率     CGSizenewSize =CGSizeMake(sourceImage.size.width, sourceImage.size.height);     CGFloattempHeight = newSize.height/ maxImageSize;

    CGFloattempWidth = newSize.width/ maxImageSize;    

if(tempWidth >1.0&& tempWidth > tempHeight) {  

      newSize =CGSizeMake(sourceImage.size.width/ tempWidth, sourceImage.size.height/ tempWidth);

    }  elseif(tempHeight >1.0&& tempWidth < tempHeight){  

      newSize =CGSizeMake(sourceImage.size.width/ tempHeight, sourceImage.size.height/ tempHeight);  

  }    

UIGraphicsBeginImageContext(newSize);     [sourceImagedrawInRect:CGRectMake(0,0,newSize.width,newSize.height)];     UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();     UIGraphicsEndImageContext();     //调整大小    

NSData*imageData =UIImageJPEGRepresentation(newImage,1.0);     CGFloatsizeOriginKB = imageData.length/1024.0;    

CGFloatresizeRate =0.9;    

while(sizeOriginKB > maxSize && resizeRate >0.1) {  

      imageData =UIImageJPEGRepresentation(newImage,resizeRate);      

  sizeOriginKB = imageData.length/1024.0;    

    resizeRate -=0.1;    

}  

  returnimageData; }


如有不到之处,希望指正,批评~

你可能感兴趣的:(iOS网络大图片缩放)