Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UIImage+;带SDWebImage的圆角_Iphone_Image_Load_Resize_Tableview - Fatal编程技术网

Iphone UIImage+;带SDWebImage的圆角

Iphone UIImage+;带SDWebImage的圆角,iphone,image,load,resize,tableview,Iphone,Image,Load,Resize,Tableview,我正在使用将图像加载到我的表视图中。我想在我的表视图中的图像被调整大小,并有圆角。我发现我可以这样做。这两个库分别工作得很好,但我还没有将它们结合起来。我可以调整SDWebImage返回的图像的大小并使其圆角,但我发现这相当耗费资源,因此我希望在将图像保存到缓存之前调整其大小。 当图像第一次从网络加载时,它可能在保存到缓存之前显示,因此我还想在第一次加载时调整图像的大小 我无法做到这一点,因为我无法找出SDWebImage的哪种方法来操作图像。我所需要的就是调用SDWebImage中右边的UII

我正在使用将图像加载到我的表视图中。我想在我的表视图中的图像被调整大小,并有圆角。我发现我可以这样做。这两个库分别工作得很好,但我还没有将它们结合起来。我可以调整SDWebImage返回的图像的大小并使其圆角,但我发现这相当耗费资源,因此我希望在将图像保存到缓存之前调整其大小。 当图像第一次从网络加载时,它可能在保存到缓存之前显示,因此我还想在第一次加载时调整图像的大小

我无法做到这一点,因为我无法找出SDWebImage的哪种方法来操作图像。我所需要的就是调用SDWebImage中右边的UIImage

UIImage *image = [image thumbnailImage:50 transparentBorder:0 cornerRadius:5 interpolationQuality:kCGInterpolationHigh];
有人能告诉我,在SDWebImage中,我应该将这段代码放在哪里,以便在将图像保存到缓存之前对其进行处理,并在从internet而不是缓存加载图像时将处理后的图像发送到图像视图吗?

我解决了这个问题

应使用SDImageCache.m中的以下方法操作图像:

 1. - (void)storeImage:(UIImage *)image forKey:(NSString *)key;
 2. - (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk;
 3. - (void)storeImage:(UIImage *)image imageData:(NSData *)data forKey:(NSString *)key toDisk:(BOOL)toDisk;
在第三种方法中,必须记住使用下面的代码将UIImage转换为NSData。如果
toDisk
为true,则应执行此操作

NSData *croppedRoundedImageData = UIImageJPEGRepresentation(croppedRoundedImage, 1.0);
if (croppedRoundedImageData) data = croppedRoundedImageData;
使用
if(crappedroundedimagedata)data=crappedroundedimagedata
如果您试图保存数据时数据为
NULL
,则应用程序不会崩溃


在SDWebImageDownloader.m中,您必须在
-(void)connectionIDFinishLoading:(NSURLConnection*)a连接中添加用于操作的代码这用于首次加载图像(不在缓存中时)

这是一个很好的发现,但我发现,通过在SDWebImageDownloader.m中添加图像处理代码,它可以为使用SDWebImage的所有图像生成缩略图。我所做的是创建一个SDWebImageManager实例并使用以下方法:

- (void) webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image; 
要创建图像,唯一的问题是因为图像出现在不同的时间,我正试图找到一种方法,将它们与动作正确链接


不过答案很好。

对于调整图像大小部分,我没有一个好答案

对于圆角功能,您完全走错了方向,这是我以前尝试做的。。。尝试调整每个图像的大小和圆整度,并将其保存到磁盘。。。。。。太复杂,太多事情要做

正确而简单的方法是设置表格单元格的UIImageView角半径:

cell.imageView.layer.cornerRadius = 8;
cell.imageView.layer.masksToBounds = YES;

我使用的是SDWebImage framework,它不允许我修改文件,但我有如下全局函数:

     + (UIImage*)circleImageWithImage:(UIImage*)image
      {
          UIImageView* imageView = [[UIImageView alloc] initWithImage:image];
          CALayer *layer = [imageView layer];
          [layer setMasksToBounds:YES];
          [layer setCornerRadius:imageView.frame.size.width / 2];

          UIGraphicsBeginImageContext(image.size);
          [layer renderInContext:UIGraphicsGetCurrentContext()];
          UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
          UIGraphicsEndImageContext();
          return newImage;
      }
      + (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize;
      {   
          UIGraphicsBeginImageContext(newSize);
          [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
          UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
          UIGraphicsEndImageContext();
          return newImage;
      }
和全局函数来缩放图像,如下所示:

     + (UIImage*)circleImageWithImage:(UIImage*)image
      {
          UIImageView* imageView = [[UIImageView alloc] initWithImage:image];
          CALayer *layer = [imageView layer];
          [layer setMasksToBounds:YES];
          [layer setCornerRadius:imageView.frame.size.width / 2];

          UIGraphicsBeginImageContext(image.size);
          [layer renderInContext:UIGraphicsGetCurrentContext()];
          UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
          UIGraphicsEndImageContext();
          return newImage;
      }
      + (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize;
      {   
          UIGraphicsBeginImageContext(newSize);
          [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
          UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
          UIGraphicsEndImageContext();
          return newImage;
      }

您需要的是SDWebImageManagerDelegate协议

我在AppDelegate类中实现了我们需要的方法

#pragma mark - SDWebImageManagerDelegate

-(UIImage*) imageManager:(SDWebImageManager *)imageManager transformDownloadedImage:(UIImage *)image withURL:(NSURL *)imageURL{

    UIGraphicsBeginImageContextWithOptions(image.size, NO, [UIScreen mainScreen].scale);

    CGRect box = CGRectMake(0, 0, image.size.width, image.size.height);
    // Add a clip before drawing anything, in the shape of an rounded rect
    [[UIBezierPath bezierPathWithRoundedRect:box
                                cornerRadius:15.f] addClip];
    // Draw your image
    [image drawInRect:box];

    // Get the image, here setting the UIImageView image
    UIImage* ret = UIGraphicsGetImageFromCurrentImageContext();

    // Lets forget about that we were drawing
    UIGraphicsEndImageContext();
    return ret;

}
您可以告诉sharedManager这样使用您的委托

SDWebImageManager* imageManager = [SDWebImageManager sharedManager];
imageManager.delegate = self;
我用选项完成了启动

请记住,这种方法沿图像的边界以其本机大小进行剪辑。如果图像的边界在视图边界之外进行渲染(纵横比填充等),则不会看到圆角


这种方法比每次渲染时剪裁图像更有效,但要注意上述缺点。

快速简便的方法,但会影响性能。在tableview性能方面,使用捷径渲染图像更好