[iphone] 종횡비와 너비를 유지하여 UIImage 크기 조정
종횡비를 유지하여 이미지 크기를 조정하는 많은 게시물에서 보았습니다. 이 함수는 크기를 조정하는 동안 RECT에 고정 소수점 (폭 및 높이)을 사용합니다. 그러나 프로젝트에서 너비 만 기준으로 뷰의 크기를 조정해야하며 가로 세로 비율을 기준으로 높이를 자동으로 가져와야합니다. 누구나 내가 이것을 달성하도록 도와줍니다.
답변
새 크기의 높이 와 너비를 모두 알고 있다면 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;
}
답변
이미지가 세로 또는 가로인지 여부를 모르는 경우 (예 : 사용자가 카메라로 사진을 찍는 경우) 최대 너비 및 높이 매개 변수를 사용하는 다른 방법을 만들었습니다.
UIImage *myLargeImage
4 : 3의 비율 을 가지고 있다고 가정 해 봅시다 .
UIImage *myResizedImage = [ImageUtilities imageWithImage:myLargeImage
scaledToMaxWidth:1024
maxHeight:1024];
가로 방향 인 경우 크기가 조정 된 UIImage는 1024×768입니다. 세로 인 경우 768×1024 이 방법은 또한 망막 디스플레이를 위해 더 높은 해상도 이미지를 생성합니다.
+ (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];
}
답변
최고의 답변 Maverick 1st가 Swift로 올바르게 번역되었습니다 (최신 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!
}
답변
@ 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
답변
@ János의 답변을 기반으로 한 가로 세로 높이 의 스위프트 5 버전
최신 UIGraphicsImageRenderer
API를 사용 하므로 유효한 UIImage
반환이 보장됩니다.
extension UIImage
{
/// Given a required height, returns a (rasterised) copy
/// of the image, aspect-fitted to that height.
func aspectFittedToHeight(_ newHeight: CGFloat) -> UIImage
{
let scale = newHeight / self.size.height
let newWidth = self.size.width * scale
let newSize = CGSize(width: newWidth, height: newHeight)
let renderer = UIGraphicsImageRenderer(size: newSize)
return renderer.image { _ in
self.draw(in: CGRect(origin: .zero, size: newSize))
}
}
}
이를 벡터 기반의 PDF 이미지 자산과 함께 사용하면 모든 렌더링 크기에서 품질을 유지할 수 있습니다.
답변
가장 간단한 방법은 프레임을 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;
}