我正在浏览以下tutorial。我需要获取大图像的缩略图。根据教程,以下方法可以实现。
CGImageRef MyCreateThumbnailImageFromData (NSData * data, int imageSize)
注意:如果您需要此方法的完整代码,请查看教程
我的问题是;
1。)我有一个网址http://www.myimage.com/smile.jpg
,我需要将其调整为缩略图。我不知道NSData * data
参数是什么。我所拥有的只是一个String URL。那么如何以编程方式将URL传递给此方法呢?
2。)上面的方法返回CGImageRef
但是我需要一个UIImage,所以我可以将它添加到UIIMageVIew然后在我的项目中显示它。那么如何使用CGImageRef
在我的项目中显示图像?
3。)我正在下载的图片非常大,2MB或更多。通过使其以缩略图大小显示,是否会减少将图像加载到视图所需的时间?
答案 0 :(得分:3)
让我们一步一步地完成这个:
1)NSData
对象是字节数组的包装器,或char *
。这是您需要的图像的原始字节。
2)CGImageRef
是CoreGraphics
表示图像的方式,可以使用选择器UIImage
将其转换为+imageWithCGImage:
。一般来说,使用CGImageRef
可以更好地控制图像。
3)将这些图像转换为缩略图不会减少下载所需的时间。在转换文件之前,必须先将文件下载到内存中。
如何使用您的功能的示例:
int myImageSize = .... // do what you need to to figure out the size of the image
UIImage *myImage = [UIImage imageWithCGImage:MyCreateThumbnailImageFromData([NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.myimage.com/smile.jpg"]], myImageSize)];
然而,这将阻止用户界面,请考虑使用GCD或NSURLConnection而不是-dataWithContentsOfURL:
。
编辑:GCD示例:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
__block UIImage *myImage = [UIImage imageWithCGImage:MyCreateThumbnailImageFromData([NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.myimage.com/smile.jpg"]], myImageSize)];
[myImageView performSelectorOnMainThread:@selector(setImage:) withObject:myImage waitUntilDone:NO];
});
答案 1 :(得分:0)
NSData* theData = [NSData dataWithContentsOfURL:@"http://www.myimage.com/smile.jpg"];
UIImage *theImage = [[UIImage alloc] initWithData:data];
UIGraphicsBeginImageContext(CGSizeMake(128, 96));
[theImage drawInRect:CGRectMake(0.0, 0.0, 128, 96)];
UIImage *myThumbnail = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *myThumbnailView = [[UIImageView alloc] initWithImage:myThumbnail];
针对异步方法的编辑:
在您的标头文件中:
NSURLConnection* connection;
NSMutableData* data;
- (void)loadImageFromURL:(NSURL*)url;
在您的实施文件中:
NSURL *url = [NSURL URLWithString:@"http://www.myimage.com/smile.jpg"]];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
- (void)loadImageFromURL:(NSURL*)url {
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(loadImageFromURL:) withObject:url waitUntilDone:NO];
return;
}
if (connection!=nil) { [connection release]; }
if (data!=nil) { [data release]; }
NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData {
if (data==nil) { data = [[NSMutableData alloc] initWithCapacity:4096]; }
[data appendData:incrementalData];
}
- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {
[connection release];
connection=nil;
UIImage *theImage = [[UIImage alloc] initWithData:data];
UIGraphicsBeginImageContext(CGSizeMake(128, 96));
[theImage drawInRect:CGRectMake(0.0, 0.0, 128, 96)];
UIImage *myThumbnail = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *myThumbnailView = [[UIImageView alloc] initWithImage:myThumbnail];
[data release];
data=nil;
}