我在許多文章中看到通過保持縱橫比來調整圖像的大小。這些功能在調整大小時使用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. ImageView填充不同的屏幕尺寸,但保持縱橫比
- 5. 在響應尺寸分區中保持圖像縱橫比
- 6. 將尺寸調整爲特定尺寸,同時保持css中的寬高比
- 7. CSS - 設置div寬度100%並調整大小保持縱橫比
- 8. 完整視圖:繪圖框架尺寸和縱橫比
- 9. 使用溢出調整過大圖像的尺寸:隱藏並保持縱橫比
- 10. 約束爲的UIImageView保持縱橫比和擴展基於設備尺寸
- 11. 最大寬度和橫幅尺寸
- 12. 保持縱橫比在OpenGL
- 13. vb.net多pictureBoxes,寬度相同,保持縱橫比
- 14. SVG高度未調整縱橫比
- 15. 我如何保持調整大小窗口的縱橫比?
- 16. 在保持縱橫比的同時調整圖像大小
- 17. Java的圖像大小調整,保持縱橫比
- 18. 如何將位圖壓縮爲較小尺寸的圖像(保持縱橫比)
- 19. 保持NSWindow視圖的高寬比,而不是縱橫比。
- 20. 調整窗口大小時保持表格縱橫比
- 21. 如何調整在d3.js圖像時不保持縱橫比
- 22. 調整圖像大小並保持縱橫比
- 23. Python PIL調整大小是否保持縱橫比?
- 24. 如何使javafx.scene.Scene調整大小,同時保持縱橫比?
- 25. 調整彈出視頻保持縱橫比在flex
- 26. 如何以橫向適應縱向圖像在縱橫比保持縱橫比
- 27. 使用2個NumericUpDown字段來維護尺寸縱橫比
- 28. Iphone 6橫向和縱向尺寸?
- 29. 調整大小,同時保持縱橫比和舍入爲整數
- 30. 調整UIImage/UIImageView的大小而不保持長寬比
儘管這裏你確實不需要newWidth變量,但它已經是'i_width'了。 –
您還需要按高度進行劃分,並使用較接近0的比例來比較比例因子。上面的代碼只適用於比高度更寬的圖片 – IceForge
如果我想要,我只需要按高度進行劃分通過縮放寬度或高度來了解我的身高比。但由於TO明確要求保持比例和寬度,而不是寬度或高度,我的回答是完全正確的。 – Maverick1st