이미지 크기를 조정하는 데 어려움을 겪고 있습니다. 기본적으로 나는 난처했다 :
UIImage를 축소하고 흐리게하는 대신 동시에 파삭 파삭하고 선명하게 만드는 방법?
이것은 합법적 인 해결책으로 보이지만 어떻게 든 제대로 작동하지 않습니다.
내 앱은 카메라 롤의 사진과 함께 작동합니다. 이 사진은 높이가 아니라 너비가 중요하지만 약 200×200 크기로 조정되어야합니다.
불행히도 작동하지 않는 솔루션에 대한 분노로 폐기했기 때문에 샘플 코드가 없습니다. 죄송합니다.
답변
다음은 내 코드입니다. 이미지의 너비는 200 픽셀이 아니라 850 픽셀입니다.
func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage {
let scale = newWidth / image.size.width
let newHeight = image.size.height * scale
UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
image.drawInRect(CGRectMake(0, 0, newWidth, newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
@IBAction func chooseImage(sender: AnyObject) {
var myPickerController = UIImagePickerController()
myPickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
myPickerController.delegate = self;
self.presentViewController(myPickerController, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject])
{
var imagenow = info[UIImagePickerControllerOriginalImage] as? UIImage
imageImage.image = resizeImage(imagenow!, newWidth: 200)
pimg2 = imageImage.image!
cidnew2 = textFieldCID!.text!
pname2 = textFieldName!.text
pmanu2 = textFieldMan!.text
pnick2 = textFieldNick!.text
podate2 = textFieldPODate!.text
pno2 = textFieldArtNo!.text
self.dismissViewControllerAnimated(true, completion: nil)
}
답변
swift_dan의 답변에 따라 Swift 3 업데이트
func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage? {
let scale = newWidth / image.size.width
let newHeight = image.size.height * scale
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
답변
투명 필름이 포함 된 PNG 이미지를 다루는 경우 허용 된 답변 함수는 실제로 투명 영역을 검은 색으로 변환합니다.
투명 필름의 크기를 조정하고 제자리에 유지하려면 다음 기능을 사용해보십시오.
SWIFT 4
extension UIImage {
func scaleImage(toSize newSize: CGSize) -> UIImage? {
var newImage: UIImage?
let newRect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height).integral
UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
if let context = UIGraphicsGetCurrentContext(), let cgImage = self.cgImage {
context.interpolationQuality = .high
let flipVertical = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: newSize.height)
context.concatenate(flipVertical)
context.draw(cgImage, in: newRect)
if let img = context.makeImage() {
newImage = UIImage(cgImage: img)
}
UIGraphicsEndImageContext()
}
return newImage
}
}
답변
Swift 3.0의 경우
이 스 니펫을 확장자로 UIImage
. 그러나 이미지를 정사각형 형태로 만들지는 않지만 그 형태라면 결과는 정사각형이됩니다.
extension UIImage {
func resizeImage(newWidth: CGFloat) -> UIImage {
let scale = newWidth / self.size.width
let newHeight = self.size.height * scale
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
self.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
} }
답변
Swift 4.0-
투명 필름이 포함 된 이미지를 다루는 경우 허용 된 답변 함수는 실제로 투명 영역을 검은 색으로 변환합니다.
투명 필름의 크기를 조정하고 제자리에 유지하려면 다음 기능을 사용해보십시오.
func resizeImageWith(image: UIImage, newSize: CGSize) -> UIImage {
let horizontalRatio = newSize.width / image.size.width
let verticalRatio = newSize.height / image.size.height
let ratio = max(horizontalRatio, verticalRatio)
let newSize = CGSize(width: image.size.width * ratio, height: image.size.height * ratio)
var newImage: UIImage
if #available(iOS 10.0, *) {
let renderFormat = UIGraphicsImageRendererFormat.default()
renderFormat.opaque = false
let renderer = UIGraphicsImageRenderer(size: CGSize(width: newSize.width, height: newSize.height), format: renderFormat)
newImage = renderer.image {
(context) in
image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
}
} else {
UIGraphicsBeginImageContextWithOptions(CGSize(width: newSize.width, height: newSize.height), isOpaque, 0)
image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
newImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
}
return newImage
}
답변
이 코드는 iOS 10에 도입 된 UIGraphicsImageRenderer를 사용합니다 . 테스트에서 UIGraphicsBeginImageContext (Swift 4 / Xcode 9)를 사용하는 이전 샘플보다 10-40 % 더 빠릅니다.
extension UIImage {
func renderResizedImage (newWidth: CGFloat) -> UIImage {
let scale = newWidth / self.size.width
let newHeight = self.size.height * scale
let newSize = CGSize(width: newWidth, height: newHeight)
let renderer = UIGraphicsImageRenderer(size: newSize)
let image = renderer.image { (context) in
self.draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize))
}
return image
}
}
답변
이 함수는 지정한 너비 의 이미지를 반환 합니다.
func scaleImage(image: UIImage, maximumWidth: CGFloat) -> UIImage {
let rect: CGRect = CGRectMake(0, 0, image.size.width, image.size.height)
let cgImage: CGImageRef = CGImageCreateWithImageInRect(image.CGImage!, rect)!
return UIImage(CGImage: cgImage, scale: image.size.width / maximumWidth, orientation: image.imageOrientation)
}
스위프트 3.0
func scaledImage(_ image: UIImage, maximumWidth: CGFloat) -> UIImage {
let rect: CGRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
let cgImage: CGImage = image.cgImage!.cropping(to: rect)!
return UIImage(cgImage: cgImage, scale: image.size.width / maximumWidth, orientation: image.imageOrientation)
}