2014-04-28 148 views
1

我目前使用的代码不是模糊的,但它只是剪掉一块,如果我尝试在网上使用不同的代码,它会剪掉一块,它也变得模糊。我需要做什么,图片是512x512,试图把它降低到100x100,这是一个JPG格式。如何调整图像大小并避免模糊?

这是我现在使用的代码:

//setting up each cell 
    -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView 
        cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    { 
     CollectionGridCell *myCell = [collectionView 
             dequeueReusableCellWithReuseIdentifier:@"GridCell" 
             forIndexPath:indexPath]; 


     long row = [indexPath row]; 

      NSURL *baseUrl = [NSURL URLWithString:@"http://example.com/"]; 

    NSString *imageItemName = [homeImages objectAtIndex:row]; 
    NSURL *url = [NSURL URLWithString:imageItemName relativeToURL:baseUrl]; 

    // NSURL *url = /* prepare a url... see note below */ 
    [myCell.homeImage setImageWithURL:url 
        placeholderImage:[UIImage imageNamed:@"menuButton.png"] 
          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { 
           // inspect cacheType here to make sure it's cached as you want it 
           myCell.homeImage.image = [self resizeImage:image newSize:CGSizeMake(75,75)]; 

          }]; 

    return myCell; 

} 


- (UIImage *)resizeImage:(UIImage*)image newSize:(CGSize)newSize { 
    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height)); 
    CGImageRef imageRef = image.CGImage; 

    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Set the quality level to use when rescaling 
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
    CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, newSize.height); 

    CGContextConcatCTM(context, flipVertical); 
    // Draw into the context; this scales the image 
    CGContextDrawImage(context, newRect, imageRef); 

    // Get the resized image from the context and a UIImage 
    CGImageRef newImageRef = CGBitmapContextCreateImage(context); 
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; 

    CGImageRelease(newImageRef); 
    UIGraphicsEndImageContext(); 

    return newImage; 

} 

更新:我试过甚至低于目前的那些每个方法,导致地修剪掉中间。我是否需要在代码中指定其他内容,是否有一些东西叫它突出中间?

这是我的网格单元.h文件中:

#import <UIKit/UIKit.h> 

@interface CollectionGridCell : UICollectionViewCell 
@property (weak, nonatomic) IBOutlet UIImageView *homeImage; 

@end 

这是我的网格单元.m文件:

#import "CollectionGridCell.h" 

@implementation CollectionGridCell 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

/* 
// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
} 
*/ 

@end 

回答

1

没有必要重新调整图像大小。只需将以下属性设置为图像视图即可。

[myCell.homeImage setImageWithURL:url 
        placeholderImage:[UIImage imageNamed:@"menuButton.png"] 
          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { 
           // inspect cacheType here to make sure it's cached as you want it 
           myCell.homeImage.image = image; 
           myCell.homeImage.contentMode = UIViewContentModeScaleAspectFit; 
          }]; 
+0

我在哪里将这个权利包含在我调用resize方法的位置,因为这样做似乎不会缩小图像的大小?我将如何指定我是否需要100x 100或50x50,即 – Lion789

+0

无需调用重新调整大小功能。查看更新后的答案。图像将自动适应ImageView。 – Apurv

+0

好吧,但做这种方法似乎只是裁剪图像的中间,并没有显示整个图像只是更小... – Lion789

0

这里有一个简单的解决方案:

- (UIImage *)resizeImage:(UIImage*)image newSize:(CGSize)newSize { 
    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height)); 
    CGImageRef imageRef = image.CGImage; 

    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Set the quality level to use when rescaling 
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
    CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, newSize.height); 

    CGContextConcatCTM(context, flipVertical); 
    // Draw into the context; this scales the image 
    CGContextDrawImage(context, newRect, imageRef); 

    // Get the resized image from the context and a UIImage 
    CGImageRef newImageRef = CGBitmapContextCreateImage(context); 
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; 

    CGImageRelease(newImageRef); 
    UIGraphicsEndImageContext();  

    return newImage; 
} 

推荐此链接: -

http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

How to scale down a UIImage and make it crispy/sharp at the same time instead of blurry?

+0

是啊,这仍显示为模糊 – Lion789

0

方法:

CGRect rect = CGRectMake(0,0,100,100); 
UIGraphicsBeginImageContext(rect.size); 
[yourCurrentOriginalImage drawInRect:rect]; 
UIImage *picture1 = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

NSData *imageData = UIImagePNGRepresentation(picture1); 
UIImage *img=[UIImage imageWithData:imageData]; 

方法2:

CGSize newSize = CGSizeMake(100, 100); 
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); 
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; //image => Your imageName 
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();  
UIGraphicsEndImageContext(); 

ImageView.contentMode = UIViewContentModeScaleAspectFit;

+0

尝试这不缩放图像,只是切出一块,所以我只看到一个100×100片的整体形象 – Lion789

+0

还是一样的问题,但看我的U​​PDATE不知道在这一点上,是否需要在我的代码中修复其他内容 – Lion789