ios – 远程图像大小,无需下载

ios – 远程图像大小,无需下载,第1张

概述使用Obj-c / Cocoa-touch,我试图获取图像列表的图像大小,但我不想下载它们. 有一些简单的方法吗?我找到了其他语言的一些解决方案,如 this SO question,但我正在寻找一种更简单的方法. 谢谢 这是我用于此的UIImage类别.它基于 fastimage.一个主要警告是NSURLConnectionDelegate设置为NSURL本身,这可能会在某些情况下导致冲突.这还 使用Obj-c / Cocoa-touch,我试图获取图像列表的图像大小,但我不想下载它们.
有一些简单的方法吗?我找到了其他语言的一些解决方案,如 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 – 远程图像大小,无需下载所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1073490.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存