已经实现单张图片了。
需要实现多张图片合并到单张图片中,类似这样的效果:

搜:
swift merge multiple into single UIImage
参考:
然后用代码:
//given an image, clip the round corner, return a round corner image
func drawCornerImage(image:UIImage, cornerRadius:CGFloat) -> UIImage {
let clippedCornerImage:UIImage
let tmpImageView = UIImageView(image: image)
let opaque:Bool = false
//let scale:CGFloat = 1.0 //will cause round corner not clear == blur
let scale:CGFloat = 0.0
// Begin a new image that will be the new image with the rounded corners
// here with the size of an UIImageView
UIGraphicsBeginImageContextWithOptions(tmpImageView.bounds.size, opaque, scale);
// Add a clip before drawing anything, in the shape of an rounded rect
let cornerBezierPath = UIBezierPath(roundedRect: tmpImageView.bounds,
cornerRadius: cornerRadius)
cornerBezierPath.addClip()
// Draw your image
image.drawInRect(tmpImageView.bounds)
// Get the clipped image
clippedCornerImage = UIGraphicsGetImageFromCurrentImageContext();
// Lets forget about that we were drawing
UIGraphicsEndImageContext();
return clippedCornerImage
}
//draw a rectangle image, filled with color, with size
func drawRectangleImage(size:CGSize, color:UIColor) -> UIImage {
let opaque:Bool = false
let scale:CGFloat = 0
UIGraphicsBeginImageContextWithOptions(size, opaque, scale)
let context = UIGraphicsGetCurrentContext()
//CGContextSetLineWidth(context, 4.0)
//CGContextSetStrokeColorWithColor(context, UIColor.blueColor().CGColor)
let rectangle = CGRectMake(0, 0, size.width, size.height)
CGContextAddRect(context, rectangle)
CGContextSetFillColorWithColor(context, color.CGColor)
CGContextFillRect(context, rectangle)
// Drawing complete, retrieve the finished image and cleanup
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
//draw a rectangle image, filled with color, with size, with label
func drawRectangleImageWithLabel(size:CGSize, color:UIColor, label:UILabel) -> UIImage {
let opaque:Bool = false
let scale:CGFloat = 0
UIGraphicsBeginImageContextWithOptions(size, opaque, scale)
let context = UIGraphicsGetCurrentContext()
//CGContextSetLineWidth(context, 4.0)
//CGContextSetStrokeColorWithColor(context, UIColor.blueColor().CGColor)
let rectangle = CGRectMake(0, 0, size.width, size.height)
CGContextAddRect(context, rectangle)
CGContextSetFillColorWithColor(context, color.CGColor)
CGContextFillRect(context, rectangle)
//label.drawTextInRect(rectangle)
label.layer.renderInContext(context!)
// Drawing complete, retrieve the finished image and cleanup
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
//merge multiple image with background image to single one image
func mergeMultipleToSingleImage(backgroundImage:UIImage, imageArr:[UIImage], drawPointArr: [CGPoint]) -> UIImage {
var mergedImage:UIImage = UIImage()
let opaque:Bool = false
let scale:CGFloat = 0
UIGraphicsBeginImageContextWithOptions(backgroundImage.size, opaque, scale)
backgroundImage.drawAtPoint(CGPointMake(0,0))
print("imageArr.count=\(imageArr.count)")
for index in 0...imageArr.count-1 {
print("index=\(index)")
imageArr[index].drawAtPoint(drawPointArr[index], blendMode: CGBlendMode.Normal, alpha: 1.0)
}
mergedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return mergedImage
}
let backgroundRectImage:UIImage = drawRectangleImage(
CGSizeMake(SIZE_CONVERSATION_HEADER_1, SIZE_CONVERSATION_HEADER_1),
color: getRandomHeaderColor())
let backgroundRoundImage:UIImage = drawCornerImage(
backgroundRectImage,
cornerRadius: SIZE_HEADER_IMAGE_CORNER_RADIUS)
var drawPointArr:[CGPoint] = [CGPoint]()
if headerCharArr.count == 1{
mergedCornerHeaderImage = cornerHeaderImageArr[0]
}
else if headerCharArr.count > 1
{
switch headerCharArr.count {
case 3:
drawPointArr.append(CGPoint(x: 0, y: 0))
drawPointArr.append(CGPoint(x: 21, y: 0))
drawPointArr.append(CGPoint(x: 10.5, y: 21))
case 4:
drawPointArr.append(CGPoint(x: 0, y: 0))
drawPointArr.append(CGPoint(x: 21, y: 0))
drawPointArr.append(CGPoint(x: 0, y: 21))
//drawPointArr.append(CGPoint(x: 21, y: 21))
//adjust some postion to avoid last one right down corner not work
drawPointArr.append(CGPoint(x: 20.5, y: 20.5))
case 9:
drawPointArr.append(CGPoint(x: 0, y: 0))
drawPointArr.append(CGPoint(x: 13.6, y: 0))
drawPointArr.append(CGPoint(x: 27.2, y: 0))
drawPointArr.append(CGPoint(x: 0, y: 13.6))
drawPointArr.append(CGPoint(x: 13.6, y: 13.6))
drawPointArr.append(CGPoint(x: 27.2, y: 13.6))
drawPointArr.append(CGPoint(x: 0, y: 27.2))
drawPointArr.append(CGPoint(x: 13.6, y: 27.2))
drawPointArr.append(CGPoint(x: 27.2, y: 27.2))
default:
break
}
print("drawPointArr=\(drawPointArr)")
//mearge background and multiple header image to single one
mergedCornerHeaderImage = mergeMultipleToSingleImage(backgroundRoundImage, imageArr: cornerHeaderImageArr, drawPointArr: drawPointArr)
}
return mergedCornerHeaderImage
}效果如下:
[后记]
关于更多的图像方面的函数,已整理至个人的库,欢迎参考: