在 Xamarin iOS C# 中将 Swift 图形代码转换为 UIKit
Convert Swift graphics code to UIKit in Xamarin iOS C#
我需要在我的 Xamarin 应用程序中将图像裁剪成圆形。
这是依赖于平台的,所以它必须使用 UIKit。
我找到了以下 Swift 代码(来源 ):
extension UIImage {
var isPortrait: Bool { size.height > size.width }
var isLandscape: Bool { size.width > size.height }
var breadth: CGFloat { min(size.width, size.height) }
var breadthSize: CGSize { .init(width: breadth, height: breadth) }
var breadthRect: CGRect { .init(origin: .zero, size: breadthSize) }
var circleMasked: UIImage? {
guard let cgImage = cgImage?
.cropping(to: .init(origin: .init(x: isLandscape ? ((size.width-size.height)/2).rounded(.down) : 0,
y: isPortrait ? ((size.height-size.width)/2).rounded(.down) : 0),
size: breadthSize)) else { return nil }
let format = imageRendererFormat
format.opaque = false
return UIGraphicsImageRenderer(size: breadthSize, format: format).image { _ in
UIBezierPath(ovalIn: breadthRect).addClip()
UIImage(cgImage: cgImage, scale: format.scale, orientation: imageOrientation)
.draw(in: .init(origin: .zero, size: breadthSize))
}
}
}
你能帮我把它转换成 UIKit C# 吗?
谢谢!
P.S。没有相关回复,所以我尽我所能整理了一个可用的版本。见下文。
对于圆形图片我推荐使用 - FFImageLoading
否则通过 xaml:
<Image Source="Image">
<Image.Clip>
<EllipseGeometry Center="30,30">
<EllipseGeometry.RadiusX>
<OnPlatform x:TypeArguments="x:Double"
iOS="30"
Android="0"/>
</EllipseGeometry.RadiusX>
<EllipseGeometry.RadiusY>
<OnPlatform x:TypeArguments="x:Double"
iOS="30"
Android="0"/>
</EllipseGeometry.RadiusY>
</EllipseGeometry>
</Image.Clip>
</Image>
没有相关回复,所以我尽我所能整理了一个有效的版本:
public UIImage cropToCircle(UIImage inimg) {
if(null == inimg) return null;
// step 1. crop to a square:
var length = Math.Min(inimg.Size.Width, inimg.Size.Height);
var x = inimg.Size.Width/2 - length/2;
var y = inimg.Size.Height/2 - length/2;
var cropRect = new CGRect(x, y, length, length);
UIGraphics.BeginImageContextWithOptions(cropRect.Size, false, 0);
var context = UIGraphics.GetCurrentContext();
context.TranslateCTM(0.0f, (float)length);
context.ScaleCTM(1.0f, -1.0f);
context.DrawImage(new RectangleF(0, 0,
(float)length, (float)length), inimg.CGImage);
context.ClipToRect(cropRect);
var croppedImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
// step 2. crop to a circle
UIImageView imageView = new UIImageView(croppedImage);
var layer = imageView.Layer;
layer.MasksToBounds = true;
layer.CornerRadius =
(nfloat)(Math.Min(imageView.Frame.Height, imageView.Frame.Width)) / 2;
UIGraphics.BeginImageContext(imageView.Bounds.Size);
layer.RenderInContext(UIGraphics.GetCurrentContext());
var circleImg = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
return circleImg;
}
(我使用图层进行循环裁剪的原因是我不知道如何将 UIBezierPath 附加到上下文)。
我需要在我的 Xamarin 应用程序中将图像裁剪成圆形。 这是依赖于平台的,所以它必须使用 UIKit。
我找到了以下 Swift 代码(来源
extension UIImage {
var isPortrait: Bool { size.height > size.width }
var isLandscape: Bool { size.width > size.height }
var breadth: CGFloat { min(size.width, size.height) }
var breadthSize: CGSize { .init(width: breadth, height: breadth) }
var breadthRect: CGRect { .init(origin: .zero, size: breadthSize) }
var circleMasked: UIImage? {
guard let cgImage = cgImage?
.cropping(to: .init(origin: .init(x: isLandscape ? ((size.width-size.height)/2).rounded(.down) : 0,
y: isPortrait ? ((size.height-size.width)/2).rounded(.down) : 0),
size: breadthSize)) else { return nil }
let format = imageRendererFormat
format.opaque = false
return UIGraphicsImageRenderer(size: breadthSize, format: format).image { _ in
UIBezierPath(ovalIn: breadthRect).addClip()
UIImage(cgImage: cgImage, scale: format.scale, orientation: imageOrientation)
.draw(in: .init(origin: .zero, size: breadthSize))
}
}
}
你能帮我把它转换成 UIKit C# 吗?
谢谢!
P.S。没有相关回复,所以我尽我所能整理了一个可用的版本。见下文。
对于圆形图片我推荐使用 - FFImageLoading
否则通过 xaml:
<Image Source="Image">
<Image.Clip>
<EllipseGeometry Center="30,30">
<EllipseGeometry.RadiusX>
<OnPlatform x:TypeArguments="x:Double"
iOS="30"
Android="0"/>
</EllipseGeometry.RadiusX>
<EllipseGeometry.RadiusY>
<OnPlatform x:TypeArguments="x:Double"
iOS="30"
Android="0"/>
</EllipseGeometry.RadiusY>
</EllipseGeometry>
</Image.Clip>
</Image>
没有相关回复,所以我尽我所能整理了一个有效的版本:
public UIImage cropToCircle(UIImage inimg) {
if(null == inimg) return null;
// step 1. crop to a square:
var length = Math.Min(inimg.Size.Width, inimg.Size.Height);
var x = inimg.Size.Width/2 - length/2;
var y = inimg.Size.Height/2 - length/2;
var cropRect = new CGRect(x, y, length, length);
UIGraphics.BeginImageContextWithOptions(cropRect.Size, false, 0);
var context = UIGraphics.GetCurrentContext();
context.TranslateCTM(0.0f, (float)length);
context.ScaleCTM(1.0f, -1.0f);
context.DrawImage(new RectangleF(0, 0,
(float)length, (float)length), inimg.CGImage);
context.ClipToRect(cropRect);
var croppedImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
// step 2. crop to a circle
UIImageView imageView = new UIImageView(croppedImage);
var layer = imageView.Layer;
layer.MasksToBounds = true;
layer.CornerRadius =
(nfloat)(Math.Min(imageView.Frame.Height, imageView.Frame.Width)) / 2;
UIGraphics.BeginImageContext(imageView.Bounds.Size);
layer.RenderInContext(UIGraphics.GetCurrentContext());
var circleImg = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
return circleImg;
}
(我使用图层进行循环裁剪的原因是我不知道如何将 UIBezierPath 附加到上下文)。