一、本地大高清图
首先我们是本地的一张大图,而你需要放置图片的位置只有几十个像素。要不选择让美工给你缩放图片,否则就可以直接用附录中代码缩放。
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; }
如有不到之处,希望指正,批评~