
有一些简单的方法吗?我找到了其他语言的一些解决方案,如 this SO question,但我正在寻找一种更简单的方法.
谢谢
解决方法 这是我用于此的UIImage类别.它基于 fastimage.一个主要警告是NSURLConnectionDelegate设置为NSURL本身,这可能会在某些情况下导致冲突.这还没有完成(例如,文件URL被忽略……)但你可以看到它的去向.标题:
#import <UIKit/UIKit.h>typedef voID (^UIImageSizeRequestCompleted) (NSURL* imgurL,CGSize size);@interface UIImage (RemoteSize)+ (voID) requestSizefor: (NSURL*) imgurL completion: (UIImageSizeRequestCompleted) completion;@end
资源:
#import "UIImage+RemoteSize.h"#import <objc/runtime.h>static char *kSizeRequestDataKey = "NSURL.sizeRequestData";static char *kSizeRequestTypeKey = "NSURL.sizeRequestType";static char *kSizeRequestCompletionKey = "NSURL.sizeRequestCompletion";typedef uint32_t DWord;@interface NSURL (RemoteSize)@property (nonatomic,strong) NSMutableData* sizeRequestData;@property (nonatomic,strong) Nsstring* sizeRequestType;@property (nonatomic,copy) UIImageSizeRequestCompleted sizeRequestCompletion;@end@implementation NSURL (RemoteSize)- (voID) setSizeRequestCompletion: (UIImageSizeRequestCompleted) block { objc_setAssociatedobject(self,&kSizeRequestCompletionKey,block,OBJC_ASSOCIATION_copY);}- (UIImageSizeRequestCompleted) sizeRequestCompletion { return objc_getAssociatedobject(self,&kSizeRequestCompletionKey);}- (voID) setSizeRequestData:(NSMutableData *)sizeRequestData { objc_setAssociatedobject(self,&kSizeRequestDataKey,sizeRequestData,OBJC_ASSOCIATION_RETAIN);}- (NSMutableData*) sizeRequestData { return objc_getAssociatedobject(self,&kSizeRequestDataKey);}- (voID) setSizeRequestType:(Nsstring *)sizeRequestType { objc_setAssociatedobject(self,&kSizeRequestTypeKey,sizeRequestType,OBJC_ASSOCIATION_RETAIN);}- (Nsstring*) sizeRequestType { return objc_getAssociatedobject(self,&kSizeRequestTypeKey);}#pragma mark - NSURLConnectionDelegate- (voID) connection: (NSURLConnection*) connection dIDReceiveResponse:(NSURLResponse *)response { [self.sizeRequestData setLength: 0]; //Redirected => reset data}- (voID) connection: (NSURLConnection*) connection dIDReceiveData:(NSData *)data { NSMutableData* receivedData = self.sizeRequestData; if( !receivedData ) { receivedData = [NSMutableData data]; self.sizeRequestData = receivedData; } [receivedData appendData: data]; //Parse Metadata const unsigned char* cString = [receivedData bytes]; const NSInteger length = [receivedData length]; const char pngSignature[8] = {137,80,78,71,13,10,26,10}; const char bmpSignature[2] = {66,77}; const char gifSignature[2] = {71,73}; const char jpgSignature[2] = {255,216}; if(!self.sizeRequestType ) { if( memcmp(pngSignature,cString,8) == 0 ) { self.sizeRequestType = @"PNG"; } else if( memcmp(bmpSignature,2) == 0 ) { self.sizeRequestType = @"BMP"; } else if( memcmp(jpgSignature,2) == 0 ) { self.sizeRequestType = @"JPG"; } else if( memcmp(gifSignature,2) == 0 ) { self.sizeRequestType = @"GIF"; } } if( [self.sizeRequestType isEqualToString: @"PNG"] ) { char type[5]; int offset = 8; DWord chunkSize = 0; int chunkSizeSize = sizeof(chunkSize); if( offset+chunkSizeSize > length ) return; memcpy(&chunkSize,cString+offset,chunkSizeSize); chunkSize = OSSwAPInt32(chunkSize); offset += chunkSizeSize; if( offset + chunkSize > length ) return; memcpy(&type,4); type[4]=''; offset += 4; if( strcmp(type,"IHDR") == 0 ) { //Should always be first DWord wIDth = 0,height = 0; memcpy(&wIDth,4); offset += 4; wIDth = OSSwAPInt32(wIDth); memcpy(&height,4); offset += 4; height = OSSwAPInt32(height); if( self.sizeRequestCompletion ) { self.sizeRequestCompletion(self,CGSizeMake(wIDth,height)); } self.sizeRequestCompletion = nil; [connection cancel]; } } else if( [self.sizeRequestType isEqualToString: @"BMP"] ) { int offset = 18; DWord wIDth = 0,height = 0; memcpy(&wIDth,4); offset += 4; memcpy(&height,4); offset += 4; if( self.sizeRequestCompletion ) { self.sizeRequestCompletion(self,height)); } self.sizeRequestCompletion = nil; [connection cancel]; } else if( [self.sizeRequestType isEqualToString: @"JPG"] ) { int offset = 4; DWord block_length = cString[offset]*256 + cString[offset+1]; while (offset<length) { offset += block_length; if( offset >= length ) break; if( cString[offset] != 0xFF ) break; if( cString[offset+1] == 0xC0 || cString[offset+1] == 0xC1 || cString[offset+1] == 0xC2 || cString[offset+1] == 0xC3 || cString[offset+1] == 0xC5 || cString[offset+1] == 0xC6 || cString[offset+1] == 0xC7 || cString[offset+1] == 0xC9 || cString[offset+1] == 0xCA || cString[offset+1] == 0xCB || cString[offset+1] == 0xCD || cString[offset+1] == 0xCE || cString[offset+1] == 0xCF ) { DWord wIDth = 0,height = 0; height = cString[offset+5]*256 + cString[offset+6]; wIDth = cString[offset+7]*256 + cString[offset+8]; if( self.sizeRequestCompletion ) { self.sizeRequestCompletion(self,height)); } self.sizeRequestCompletion = nil; [connection cancel]; } else { offset += 2; block_length = cString[offset]*256 + cString[offset+1]; } } } else if( [self.sizeRequestType isEqualToString: @"GIF"] ) { int offset = 6; DWord wIDth = 0,2); offset += 2; memcpy(&height,2); offset += 2; if( self.sizeRequestCompletion ) { self.sizeRequestCompletion(self,height)); } self.sizeRequestCompletion = nil; [connection cancel]; }}- (voID) connection: (NSURLConnection*) connection dIDFailWithError:(NSError *)error { if( self.sizeRequestCompletion ) self.sizeRequestCompletion(self,CGSizeZero);}- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { return cachedResponse;}- (voID) connectionDIDFinishLoading: (NSURLConnection *)connection { // Basically,we Failed to obtain the image size using Metadata and the // entire image was downloaded... if(!self.sizeRequestData.length) { self.sizeRequestData = nil; } else { //Try parse to UIImage UIImage* image = [UIImage imageWithData: self.sizeRequestData]; if( self.sizeRequestCompletion && image) { self.sizeRequestCompletion(self,[image size]); return; } } self.sizeRequestCompletion(self,CGSizeZero);}@end@implementation UIImage (RemoteSize)+ (voID) requestSizefor: (NSURL*) imgurL completion: (UIImageSizeRequestCompleted) completion { if( [imgurL isfileURL] ) { //Load from file stream } else { imgurL.sizeRequestCompletion = completion; NSURLRequest* request = [NSURLRequest requestWithURL: imgurL]; NSURLConnection* conn = [NSURLConnection connectionWithRequest: request delegate: imgurL]; [conn scheduleInRunLoop: [NSRunLoop mainRunLoop] forMode: NSDefaultRunLoopMode]; [conn start]; }}@end 总结 以上是内存溢出为你收集整理的ios – 远程图像大小,无需下载全部内容,希望文章能够帮你解决ios – 远程图像大小,无需下载所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)