我在许多文章中看到通过保持纵横比来调整图像的大小。这些功能在调整大小时使用RECT的固定点(宽度和高度)。但在我的项目中,我只需根据宽度调整视图大小,高度应根据高宽比自动调整。 任何人都可以帮助我实现这一点。通过保持纵横比和宽度来调整UIImage的尺寸
回答
Srikar的方法效果非常好,如果你知道这两个高度和宽度您的新尺寸。 例如,如果您只知道要缩放到的宽度,并且不关心您首先必须计算高度的比例因子的高度。
+(UIImage*)imageWithImage: (UIImage*) sourceImage scaledToWidth: (float) i_width
{
float oldWidth = sourceImage.size.width;
float scaleFactor = i_width/oldWidth;
float newHeight = sourceImage.size.height * scaleFactor;
float newWidth = oldWidth * scaleFactor;
UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
[sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
最简单的方法是设置您的UIImageView
的框架并将contentMode
设置为其中一个调整大小选项。
的代码是这样的 - 这可以作为一个实用的方法 -
+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize
{
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
我设法让它只用设置'contentMode'。 –
如果你不知道发生如果图像将是纵向还是横向(例如用户需要与摄像头PIC),我创建了另一个是需要最大宽度和高度参数的方法。
比方说你有一个UIImage *myLargeImage
这是一个4:3的比例。
UIImage *myResizedImage = [ImageUtilities imageWithImage:myLargeImage
scaledToMaxWidth:1024
maxHeight:1024];
调整大小的UIImage将是1024x768如果风景;如果是肖像,则为768x1024。这种方法也会生成更高分辨率的视网膜显示图像。
+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)size {
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions(size, NO, [[UIScreen mainScreen] scale]);
} else {
UIGraphicsBeginImageContext(size);
}
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
+ (UIImage *)imageWithImage:(UIImage *)image scaledToMaxWidth:(CGFloat)width maxHeight:(CGFloat)height {
CGFloat oldWidth = image.size.width;
CGFloat oldHeight = image.size.height;
CGFloat scaleFactor = (oldWidth > oldHeight) ? width/oldWidth : height/oldHeight;
CGFloat newHeight = oldHeight * scaleFactor;
CGFloat newWidth = oldWidth * scaleFactor;
CGSize newSize = CGSizeMake(newWidth, newHeight);
return [ImageUtilities imageWithImage:image scaledToSize:newSize];
}
只需导入AVFoundation和使用AVMakeRectWithAspectRatioInsideRect(CGRectCurrentSize, CGRectMake(0, 0, YOUR_WIDTH, CGFLOAT_MAX)
为了提高对瑞安的答案:
+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)size {
CGFloat oldWidth = image.size.width;
CGFloat oldHeight = image.size.height;
//You may need to take some retina adjustments into consideration here
CGFloat scaleFactor = (oldWidth > oldHeight) ? width/oldWidth : height/oldHeight;
return [UIImage imageWithCGImage:image.CGImage scale:scaleFactor orientation:UIImageOrientationUp];
}
感谢@ Maverick1st的算法,我实现它Swift
,在我的情况下,高度是输入参数
class func resizeImage(image: UIImage, newHeight: CGFloat) -> UIImage {
let scale = newHeight/image.size.height
let newWidth = image.size.width * scale
UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
image.drawInRect(CGRectMake(0, 0, newWidth, newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
此方法是UIImage上的一个类别。使用AVFoundation进行缩放以适应几行代码。 不要忘记导入#import <AVFoundation/AVFoundation.h>
。
@implementation UIImage (Helper)
- (UIImage *)imageScaledToFitToSize:(CGSize)size
{
CGRect scaledRect = AVMakeRectWithAspectRatioInsideRect(self.size, CGRectMake(0, 0, size.width, size.height));
UIGraphicsBeginImageContextWithOptions(size, NO, 0);
[self drawInRect:scaledRect];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage;
}
@end
发现这个以最小的内存占用给我最好的结果。 +1 –
非常棒,非常感谢。 –
瑞安的解决方案@Ryan 在SWIFT代码
使用:
func imageWithSize(image: UIImage,size: CGSize)->UIImage{
if UIScreen.mainScreen().respondsToSelector("scale"){
UIGraphicsBeginImageContextWithOptions(size,false,UIScreen.mainScreen().scale);
}
else
{
UIGraphicsBeginImageContext(size);
}
image.drawInRect(CGRectMake(0, 0, size.width, size.height));
var newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
//Summon this function VVV
func resizeImageWithAspect(image: UIImage,scaledToMaxWidth width:CGFloat,maxHeight height :CGFloat)->UIImage
{
let oldWidth = image.size.width;
let oldHeight = image.size.height;
let scaleFactor = (oldWidth > oldHeight) ? width/oldWidth : height/oldHeight;
let newHeight = oldHeight * scaleFactor;
let newWidth = oldWidth * scaleFactor;
let newSize = CGSizeMake(newWidth, newHeight);
return imageWithSize(image, size: newSize);
}
好了,我们这里有用于调整图像几个很好的答案,但我只是修改按我的需要。希望这能帮助像我这样的人。
我的要求是
- 如果图像宽度大于1920,与1920的宽度和高度保持与原始的宽高比调整其大小。
- 如果图像高度超过1080,请使用1080高度调整其大小,并使用原始高宽比保持宽度。
if (originalImage.size.width > 1920)
{
CGSize newSize;
newSize.width = 1920;
newSize.height = (1920 * originalImage.size.height)/originalImage.size.width;
originalImage = [ProfileEditExperienceViewController imageWithImage:originalImage scaledToSize:newSize];
}
if (originalImage.size.height > 1080)
{
CGSize newSize;
newSize.width = (1080 * originalImage.size.width)/originalImage.size.height;
newSize.height = 1080;
originalImage = [ProfileEditExperienceViewController imageWithImage:originalImage scaledToSize:newSize];
}
+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize
{
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
感谢@Srikar Appal,调整大小我用他的方法。
您可能还想检查this以及调整大小的计算。
我有一个更简单的方法
UIImage *placeholder = [UIImage imageNamed:@"OriginalImage.png"];
self.yourImageview.image = [UIImage imageWithCGImage:[placeholder CGImage] scale:(placeholder.scale * 1.5)
orientation:(placeholder.imageOrientation)];
乘数规模将定义图像的scalling,更乘数越小,图像解决它。所以你可以检查什么适合你的屏幕。
或者你也可以通过分割图像宽度/屏幕宽度来获得多倍。
最佳答案特立独行1日的正确翻译为斯威夫特(带最新的SWIFT 3工作):
func imageWithImage (sourceImage:UIImage, scaledToWidth: CGFloat) -> UIImage {
let oldWidth = sourceImage.size.width
let scaleFactor = scaledToWidth/oldWidth
let newHeight = sourceImage.size.height * scaleFactor
let newWidth = oldWidth * scaleFactor
UIGraphicsBeginImageContext(CGSize(width:newWidth, height:newHeight))
sourceImage.draw(in: CGRect(x:0, y:0, width:newWidth, height:newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
In Swift 3有一些变化。 这里是UIImage的扩展:
public extension UIImage {
public func resize(height: CGFloat) -> UIImage? {
let scale = height/self.size.height
let width = self.size.width * scale
UIGraphicsBeginImageContext(CGSize(width: width, height: height))
self.draw(in: CGRect(x:0, y:0, width:width, height:height))
let resultImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return resultImage
}
}
这对我来说是完美的。保持宽高比并需要maxLength
。宽度或高度不会超过maxLength
-(UIImage*)imageWithImage: (UIImage*) sourceImage maxLength: (float) maxLength
{
CGFloat scaleFactor = maxLength/MAX(sourceImage.size.width, sourceImage.size.height);
float newHeight = sourceImage.size.height * scaleFactor;
float newWidth = sourceImage.size.width * scaleFactor;
UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
[sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
- 1. 保持SVG纵横比和调整父母的尺寸
- 2. 调整UIImage的纵横比?
- 3. 在响应尺寸分区中保持图像纵横比
- 4. 约束为的UIImageView保持纵横比和扩展基于设备尺寸
- 5. 保持纵横比在OpenGL
- 6. SVG高度未调整纵横比
- 7. 我如何保持调整大小窗口的纵横比?
- 8. Java的图像大小调整,保持纵横比
- 9. 在保持纵横比的同时调整图像大小
- 10. 如何使javafx.scene.Scene调整大小,同时保持纵横比?
- 11. 调整图像大小并保持纵横比
- 12. 调整弹出视频保持纵横比在flex
- 13. 调整窗口大小时保持表格纵横比
- 14. 如何调整在d3.js图像时不保持纵横比
- 15. 调整图像大小保持纵横比
- 16. Python PIL调整大小是否保持纵横比?
- 17. 如何以横向适应纵向图像在纵横比保持纵横比
- 18. Iphone 6横向和纵向尺寸?
- 19. 调整UIImage/UIImageView的大小而不保持长宽比
- 20. 调整格但保持尺寸
- 21. 调整宽度和高度的iframe根据屏幕尺寸
- 22. 使用GD调整图像尺寸并保留长宽比
- 23. 柔性的VideoDisplay不保持纵横比
- 24. 如何保持UserControl的纵横比?
- 25. Jquery,通过保持高度不变的宽度来调整图像大小
- 26. 调整绘图的纵横比R
- 27. 调整纵横比的图像
- 28. CSS - 保持图像纵横比flexbox
- 29. 弹力SVG保持纵横比
- 30. 为纵向和横向模式调整UIImage的大小
尽管这里你确实不需要newWidth变量,但它已经是'i_width'了。 –
您还需要按高度进行划分,并使用较接近0的比例来比较比例因子。上面的代码只适用于比高度更宽的图片 – IceForge
如果我想要,我只需要按高度进行划分通过缩放宽度或高度来了解我的身高比。但由于TO明确要求保持比例和宽度,而不是宽度或高度,我的回答是完全正确的。 – Maverick1st