使用 Core Graphics 在 UIImage 上绘制矩形
Draw Rectangle On UIImage with Core Graphics
我正在尝试使用 Core Graphics 在 UIImage 的中心放置一个矩形,大致如下所示:
到目前为止,这是我的代码:
func drawRectangleOnImage(image: UIImage) -> UIImage {
let imageSize = image.size
let scale: CGFloat = 0
UIGraphicsBeginImageContextWithOptions(imageSize, false, scale)
let context = UIGraphicsGetCurrentContext()
let rectangle = CGRect(x: 0, y: (imageSize.height/2) - 30, width: imageSize.width, height: 60)
CGContextSetFillColorWithColor(context, UIColor.blackColor().CGColor)
CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor)
CGContextSetLineWidth(context, 5)
CGContextAddRect(context, rectangle)
CGContextDrawPath(context, .Fill)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
我觉得好像它不是在我发送的图像之上绘制,它完全是在创建一个新图像。整个东西变成红色,矩形变黑。我想要黑色矩形,其余部分应该和图片一样。
我做错了什么?
I feel as if it's not drawing on top of the image which I sent in,
it's creating a new image altogether.
没有感情。这就是这段代码的作用。
- 创建新上下文
- 在里面画一个矩形
- 根据上下文制作图像,returns它
在第 1 步和第 2 步之间,您需要将原始图像绘制到上下文中。
此外,无需设置线条宽度或描边颜色,因为您只是填充矩形,而不是描边。 (如果您出于某种原因看到红色,那不是因为此代码;您是否有其他具有红色背景的视图或图像?)
func drawRectangleOnImage(image: UIImage) -> UIImage {
let imageSize = image.size
let scale: CGFloat = 0
UIGraphicsBeginImageContextWithOptions(imageSize, false, scale)
let context = UIGraphicsGetCurrentContext()
image.draw(at: CGPoint.zero)
let rectangle = CGRect(x: 0, y: (imageSize.height/2) - 30, width: imageSize.width, height: 60)
CGContextSetFillColorWithColor(context, UIColor.black.CGColor)
CGContextAddRect(context, rectangle)
CGContextDrawPath(context, .Fill)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
您还可以通过使用更高级别的 UIKit API 进行绘制来进一步简化。
func drawRectangleOnImage(image: UIImage) -> UIImage {
let imageSize = image.size
let scale: CGFloat = 0
UIGraphicsBeginImageContextWithOptions(imageSize, false, scale)
image.draw(at: CGPoint.zero)
let rectangle = CGRect(x: 0, y: (imageSize.height/2) - 30, width: imageSize.width, height: 60)
UIColor.black.setFill()
UIRectFill(rectangle)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
Objective C 版本的 Kurt Revis 回答
-(UIImage *)drawRectangleOnImage:(UIImage *)img rect:(CGRect )rect{
CGSize imgSize = img.size;
CGFloat scale = 0;
UIGraphicsBeginImageContextWithOptions(imgSize, NO, scale);
[img drawAtPoint:CGPointZero];
[[UIColor greenColor] setFill];
UIRectFill(rect);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
你可以轻松实现
guard let img = actualImage else { return }
let croppedImage = img.cgImage!.cropping(to: CGRect(x: 0, y: 0, width: 50, height: 20))
let img = UIImage(cgImage: croppedImage!)
我正在尝试使用 Core Graphics 在 UIImage 的中心放置一个矩形,大致如下所示:
到目前为止,这是我的代码:
func drawRectangleOnImage(image: UIImage) -> UIImage {
let imageSize = image.size
let scale: CGFloat = 0
UIGraphicsBeginImageContextWithOptions(imageSize, false, scale)
let context = UIGraphicsGetCurrentContext()
let rectangle = CGRect(x: 0, y: (imageSize.height/2) - 30, width: imageSize.width, height: 60)
CGContextSetFillColorWithColor(context, UIColor.blackColor().CGColor)
CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor)
CGContextSetLineWidth(context, 5)
CGContextAddRect(context, rectangle)
CGContextDrawPath(context, .Fill)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
我觉得好像它不是在我发送的图像之上绘制,它完全是在创建一个新图像。整个东西变成红色,矩形变黑。我想要黑色矩形,其余部分应该和图片一样。
我做错了什么?
I feel as if it's not drawing on top of the image which I sent in, it's creating a new image altogether.
没有感情。这就是这段代码的作用。
- 创建新上下文
- 在里面画一个矩形
- 根据上下文制作图像,returns它
在第 1 步和第 2 步之间,您需要将原始图像绘制到上下文中。
此外,无需设置线条宽度或描边颜色,因为您只是填充矩形,而不是描边。 (如果您出于某种原因看到红色,那不是因为此代码;您是否有其他具有红色背景的视图或图像?)
func drawRectangleOnImage(image: UIImage) -> UIImage {
let imageSize = image.size
let scale: CGFloat = 0
UIGraphicsBeginImageContextWithOptions(imageSize, false, scale)
let context = UIGraphicsGetCurrentContext()
image.draw(at: CGPoint.zero)
let rectangle = CGRect(x: 0, y: (imageSize.height/2) - 30, width: imageSize.width, height: 60)
CGContextSetFillColorWithColor(context, UIColor.black.CGColor)
CGContextAddRect(context, rectangle)
CGContextDrawPath(context, .Fill)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
您还可以通过使用更高级别的 UIKit API 进行绘制来进一步简化。
func drawRectangleOnImage(image: UIImage) -> UIImage {
let imageSize = image.size
let scale: CGFloat = 0
UIGraphicsBeginImageContextWithOptions(imageSize, false, scale)
image.draw(at: CGPoint.zero)
let rectangle = CGRect(x: 0, y: (imageSize.height/2) - 30, width: imageSize.width, height: 60)
UIColor.black.setFill()
UIRectFill(rectangle)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
Objective C 版本的 Kurt Revis 回答
-(UIImage *)drawRectangleOnImage:(UIImage *)img rect:(CGRect )rect{
CGSize imgSize = img.size;
CGFloat scale = 0;
UIGraphicsBeginImageContextWithOptions(imgSize, NO, scale);
[img drawAtPoint:CGPointZero];
[[UIColor greenColor] setFill];
UIRectFill(rect);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
你可以轻松实现
guard let img = actualImage else { return }
let croppedImage = img.cgImage!.cropping(to: CGRect(x: 0, y: 0, width: 50, height: 20))
let img = UIImage(cgImage: croppedImage!)