Как масштабировать обрезку и сократить Uiimage до круга в Swift, используя UigraphicsImagerenderer?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Гость
 Как масштабировать обрезку и сократить Uiimage до круга в Swift, используя UigraphicsImagerenderer?

Сообщение Гость »

В настоящее время я использую следующий Swift Code для масштабирования обрезки и изготовления кругового изображения из прошедшего UIImage. Все работает до iOS 18, но после этого я могу наблюдать за авариями. Я обнаружил, что начиная с iOS 18 следующие три метода устарели; < /p>
UIGraphics.BeginImageContextWithOptions(size, false, ScreenDensity);
var image = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();

Из других сообщений рекомендуется использовать UgraphicsImagerenderer и связанные с ним функции. Вот полный код с использованием вышеупомянутых API. < /P>
func scaleCropAndCircleImage(image:UIImage, frame:CGRect) throws -> UIImage {

enum FunctionError: Error {
case nilContext
case nilImage
}

UIGraphicsBeginImageContextWithOptions(CGSizeMake(frame.size.width, frame.size.height), false, 0.0)
guard let context = UIGraphicsGetCurrentContext() else { throw FunctionError.nilContext }

// width and heights of passed values of uiimage and CGRect
let passedimageWidth = image.size.width
let passedimageHeight = image.size.height
let passedrectWidth = frame.size.width
let passedrectHeight = frame.size.height

// scale factor calculation
let scaleFactorX = passedrectWidth/passedimageWidth
let scaleFactorY = passedrectHeight/passedimageHeight

// centre of the circle calculation
let imageCentreX = passedrectWidth/2
let imageCentreY = passedrectHeight/2

// Creating and clipping to a CIRCULAR Path
let radius = passedrectWidth/2
context.beginPath()
context.addArc(center: CGPoint(x: imageCentreX, y: imageCentreY), radius: radius, startAngle: 0, endAngle: 2 * .pi, clockwise: false)
context.closePath()
context.clip()

//Seting the scaling factor for graphics context
context.scaleBy(x: scaleFactorX, y: scaleFactorY)

let myRect:CGRect = CGRectMake(0, 0, passedimageWidth, passedimageHeight)
image.draw(in: myRect)

let newCroppedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

guard let newCroppedImage else { throw FunctionError.nilImage }

return newCroppedImage
}

Теперь я пытаюсь заменить устаревшие функции, используя UigraphicsImagerenderer , но я застрял в середине пути, как преобразовать уже используемую логику для UigraphicsImagerenderer функции. Ниже приведен код, который я пробовал до сих пор. Может ли кто -нибудь помочь мне в этом, чтобы приведенная ниже функция могла принять Uiimage и обрезать его в круг, как это сделано в существующем коде? < /P>
import UIKit

extension UIImage {
func roundedCornerImage(with radius: CGFloat) -> UIImage {
let format = UIGraphicsImageRendererFormat()
format.scale = scale
let renderer = UIGraphicsImageRenderer(size: size, format: format)
return renderer.image { rendererContext in
let rect = CGRect(origin: .zero, size: size)
let path = UIBezierPath(roundedRect: rect,
byRoundingCorners: .allCorners,
cornerRadii: CGSize(width: radius, height: radius))
path.close()

let cgContext = rendererContext.cgContext
cgContext.saveGState()
path.addClip()
draw(in: rect)
cgContext.restoreGState()
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... phicsimage
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»