2011-08-13 31 views
5

Tôi đang sử dụng SDWebImage để tải hình ảnh vào chế độ xem bảng của mình. Tôi muốn các hình ảnh trong chế độ xem bảng của tôi được thay đổi kích thước và có các góc tròn. Tôi đã tìm thấy UIImage+Resize and UIImage+RoundedCorner để thực hiện việc này. Cả hai thư viện hoạt động rất riêng biệt nhưng tôi không được kết hợp chúng. Tôi có thể thay đổi kích thước và vòng các góc của hình ảnh SDWebImage trả về nhưng tôi đã tìm thấy đây là khá tài nguyên nặng và do đó tôi muốn có những hình ảnh thay đổi kích cỡ trước khi lưu chúng vào bộ nhớ cache. Khi một hình ảnh được tải từ mạng lần đầu tiên nó có thể được hiển thị trước khi được lưu vào bộ nhớ cache, do đó tôi cũng muốn thay đổi kích thước hình ảnh khi nó được tải lần đầu tiên.UIImage + RoundedCorner với SDWebImage

Tôi đã không thể thực hiện điều này vì tôi không thể tìm ra phương pháp nào của SDWebImage để thao tác hình ảnh. Tất cả những gì tôi cần là gọi những điều sau đây trên UIImage phù hợp trong SDWebImage.

UIImage *image = [image thumbnailImage:50 transparentBorder:0 cornerRadius:5 interpolationQuality:kCGInterpolationHigh]; 

bất cứ ai có thể cho tôi biết nơi ở SDWebImage Tôi nên đặt đoạn mã này để có hình ảnh thao tác trước khi được lưu vào bộ nhớ cache và có một hình ảnh thao tác gửi đến xem hình ảnh khi nó được tải từ internet và không phải bộ nhớ cache?

Trả lời

2

Tôi đã tìm ra điều này.

Bạn nên thao tác các hình ảnh trong các phương pháp sau đây trong 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; 

Trong phương pháp thứ ba, bạn phải nhớ để chuyển đổi UIImage của bạn để NSData sử dụng mã dưới đây. Điều này nên được thực hiện nếu toDisk là đúng sự thật.

NSData *croppedRoundedImageData = UIImageJPEGRepresentation(croppedRoundedImage, 1.0); 
if (croppedRoundedImageData) data = croppedRoundedImageData; 

Sử dụng if (croppedRoundedImageData) data = croppedRoundedImageData; ứng dụng của bạn sẽ không sụp đổ nếu dữ liệu của bạn là NULL khi bạn cố gắng để lưu nó.

Trong SDWebImageDownloader.m bạn phải thêm mã của bạn để thao tác trong - (void)connectionDidFinishLoading:(NSURLConnection *)aConnection này được sử dụng cho tải đầu tiên của hình ảnh (khi không trong bộ nhớ cache)

0

Đây là một phát hiện tuyệt vời, nhưng tôi thấy rằng bằng cách thêm của bạn Mã thao tác hình ảnh trong SDWebImageDownloader.m nó làm cho hình thu nhỏ cho tất cả các hình ảnh bằng cách sử dụng SDWebImage. Những gì tôi đã làm là tạo ra một thể hiện SDWebImageManager và sử dụng phương pháp này:

- (void) webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image; 

để tạo ra những hình ảnh, vấn đề duy nhất là vì những hình ảnh đi kèm trong thời điểm khác nhau Tôi đang cố gắng để tìm một cách để liên kết chúng đúng cách với một hoạt động.

Câu trả lời hay.

6

Đối với phần hình ảnh thay đổi kích thước, tôi không có câu trả lời hay.

Đối với các góc tròn, bạn hoàn toàn đi sai hướng, đây là những gì tôi cố gắng làm trước ... thử thay đổi kích thước và làm tròn mọi ảnh và lưu nó vào đĩa ...... phức tạp, quá nhiều việc phải làm ...

cách chính xác và đơn giản là để thiết lập các UIImageView cornerRadius của ô trong bảng của bạn:

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

Cách nhanh chóng và dễ dàng, nhưng ảnh hưởng đến hiệu suất. Hiển thị hình ảnh với các góc cắt là tốt hơn về hiệu suất của tableview – gavrix

0

Im sử dụng khuôn khổ SDWebImage mà không cho tôi khả năng sửa đổi các tập tin nhưng tôi có một chức năng toàn cầu như này:

 + (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; 
     } 

và Chức năng toàn cầu để mở rộng hình ảnh như thế này:

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

Giao thức SDWebImageManagerDelegate là giao thức bạn đang tìm kiếm.

https://github.com/rs/SDWebImage/blob/master/SDWebImage/SDWebImageManager.h#LC96

tôi thực hiện các phương pháp chúng ta cần trong lớp appdelegate tôi.

#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; 

} 

Bạn có thể yêu cầu sharedManager sử dụng đại biểu của bạn như thế này.

SDWebImageManager* imageManager = [SDWebImageManager sharedManager]; 
imageManager.delegate = self; 

Tôi đã làm điều này trong didFinishLaunchingWithOptions.

Hãy nhớ rằng cách tiếp cận này clip dọc theo giới hạn của hình ảnh ở kích thước gốc của nó. Nếu các giới hạn của hình ảnh của bạn đang được hiển thị bên ngoài giới hạn của chế độ xem của bạn (khía cạnh lấp đầy, v.v.), bạn sẽ không thấy các góc được làm tròn.

Cách tiếp cận này có hiệu suất cao hơn là cắt bớt hình ảnh mỗi khi nó được hiển thị, nhưng phải nhận thức được những bất lợi trên.