将图像显示到视图

时间:2012-02-02 01:32:44

标签: iphone objective-c

我正在浏览以下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或更多。通过使其以缩略图大小显示,是否会减少将图像加载到视图所需的时间?

2 个答案:

答案 0 :(得分:3)

让我们一步一步地完成这个:

1)NSData对象是字节数组的包装器,或char *。这是您需要的图像的原始字节。

2)CGImageRefCoreGraphics表示图像的方式,可以使用选择器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;
}