调整UIImage的大小并更改UIImageView的大小

我有这个UIImageView ,我有它的最大高度和最大宽度的值。 我想要实现的是我想要的图像(任何长宽比和任何分辨率),我希望它适合在边界,所以图片不超过他们,但它可以缩小他们想要的。 (图中标有红色):

在这里输入图像说明

现在图像适合所需的大小,但我有两个担心:1. UIImageView不等于大小的resize的图像,从而留下红色的背景(我不希望这样)2.如果图像较小我的UIImageView的高度没有被调整到更小,它保持相同的高度。

这是我的代码,我知道它的错误:

 UIImage *actualImage = [attachmentsArray lastObject]; UIImageView *attachmentImageNew = [[UIImageView alloc] initWithFrame:CGRectMake(5.5, 6.5, 245, 134)]; attachmentImageNew.image = actualImage; attachmentImageNew.backgroundColor = [UIColor redColor]; attachmentImageNew.contentMode = UIViewContentModeScaleAspectFit; 

那么如何dynamic地改变UIImageView.image的大小,而不是整个UIImageView的大小,从而使其大小完全可以调整其内容。 任何帮助将不胜感激,谢谢!

当获取resize的图像的宽度和高度获取UIViewContentModeScaleAspectFit后resize的图像的宽度时 ,可以调整imageView的大小:

 imageView.frame = CGRectMake(0, 0, resizedWidth, resizedHeight); imageView.center = imageView.superview.center; 

我没有检查它是否有效,但我认为一切都可以

 - (UIImage *)image:(UIImage*)originalImage scaledToSize:(CGSize)size { //avoid redundant drawing if (CGSizeEqualToSize(originalImage.size, size)) { return originalImage; } //create drawing context UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); //draw [originalImage drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)]; //capture resultant image UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //return image return image; } 

这是Rajneesh071的答案,使用扩展的Swift等价物

 UIImage { func scaleToSize(aSize :CGSize) -> UIImage { if (CGSizeEqualToSize(self.size, aSize)) { return self } UIGraphicsBeginImageContextWithOptions(aSize, false, 0.0) self.drawInRect(CGRectMake(0.0, 0.0, aSize.width, aSize.height)) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } } 

用法:

 let image = UIImage(named: "Icon") item.icon = image?.scaleToSize(CGSize(width: 30.0, height: 30.0)) 

使用下面的类别,然后将来自Quartz的边框应用到您的图像中:

 [yourimage.layer setBorderColor:[[UIColor whiteColor] CGColor]]; [yourimage.layer setBorderWidth:2]; 

类别:UIImage + AutoScaleResize.h

 #import <Foundation/Foundation.h> @interface UIImage (AutoScaleResize) - (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize; @end 

的UIImage + AutoScaleResize.m

 #import "UIImage+AutoScaleResize.h" @implementation UIImage (AutoScaleResize) - (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize { UIImage *sourceImage = self; UIImage *newImage = nil; CGSize imageSize = sourceImage.size; CGFloat width = imageSize.width; CGFloat height = imageSize.height; CGFloat targetWidth = targetSize.width; CGFloat targetHeight = targetSize.height; CGFloat scaleFactor = 0.0; CGFloat scaledWidth = targetWidth; CGFloat scaledHeight = targetHeight; CGPoint thumbnailPoint = CGPointMake(0.0,0.0); if (CGSizeEqualToSize(imageSize, targetSize) == NO) { CGFloat widthFactor = targetWidth / width; CGFloat heightFactor = targetHeight / height; if (widthFactor > heightFactor) { scaleFactor = widthFactor; // scale to fit height } else { scaleFactor = heightFactor; // scale to fit width } scaledWidth = width * scaleFactor; scaledHeight = height * scaleFactor; // center the image if (widthFactor > heightFactor) { thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; } else { if (widthFactor < heightFactor) { thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; } } } UIGraphicsBeginImageContext(targetSize); // this will crop CGRect thumbnailRect = CGRectZero; thumbnailRect.origin = thumbnailPoint; thumbnailRect.size.width = scaledWidth; thumbnailRect.size.height = scaledHeight; [sourceImage drawInRect:thumbnailRect]; newImage = UIGraphicsGetImageFromCurrentImageContext(); if(newImage == nil) { NSLog(@"could not scale image"); } //pop the context to get back to the default UIGraphicsEndImageContext(); return newImage; } @end 

我想你想要的是一个不同的content mode 。 尝试使用UIViewContentModeScaleToFill 。 这将根据需要通过改变内容的高宽比来缩放内容以适应UIImageView的大小。

查看官方文档中的content mode部分,以更好地了解可用的不同内容模式(用图像说明)。

如果你有图像的大小,为什么不把图像视图的frame.size设置为这个大小?

编辑 – –

好吧,看到你的评论,我build议:

 UIImageView *imageView; //so let's say you're image view size is set to the maximum size you want CGFloat maxWidth = imageView.frame.size.width; CGFloat maxHeight = imageView.frame.size.height; CGFloat viewRatio = maxWidth / maxHeight; CGFloat imageRatio = image.size.height / image.size.width; if (imageRatio > viewRatio) { CGFloat imageViewHeight = round(maxWidth * imageRatio); imageView.frame = CGRectMake(0, ceil((self.bounds.size.height - imageViewHeight) / 2.f), maxWidth, imageViewHeight); } else if (imageRatio < viewRatio) { CGFloat imageViewWidth = roundf(maxHeight / imageRatio); imageView.frame = CGRectMake(ceil((maxWidth - imageViewWidth) / 2.f), 0, imageViewWidth, maxHeight); } else { //your image view is already at the good size } 

此代码将调整图像视图的图像比例,并将图像视图放置在与“默认”位置相同的中心位置。

PS:我希望你设置imageView.layer.rasterizationScale = [UIScreen mainScreen].scale; imageView.layer.shouldRasterise = YESimageView.layer.rasterizationScale = [UIScreen mainScreen].scale;

如果你正在使用CALayer阴影效果);这将大大提高你的用户界面的性能。

  if([[SDWebImageManager sharedManager] diskImageExistsForURL:[NSURL URLWithString:@"URL STRING1"]]) { NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:[NSURL URLWithString:@"URL STRING1"]]; UIImage *tempImage=[self imageWithImage:[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key] scaledToWidth:cell.imgview.bounds.size.width]; cell.imgview.image=tempImage; } else { [cell.imgview sd_setImageWithURL:[NSURL URLWithString:@"URL STRING1"] placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { UIImage *tempImage=[self imageWithImage:image scaledToWidth:cell.imgview.bounds.size.width]; cell.imgview.image=tempImage; // [tableView beginUpdates]; // [tableView endUpdates]; }]; }