结合 2 张图像,工作但拉伸
Combining 2 images, working but stretching
我有一个方形图像视图,如果用户决定添加另一张图像,它会进入右侧的同一图像视图。所以图像视图的左半部分是图像 1,右半部分是图像 2。我的代码唯一的问题是它将两个图像都压缩到图像视图中。
@IBAction func secondactiontakepicture(sender: AnyObject) {
ImagePickerManager.sharedManager.presentImagePicker(self) { (image, source) -> () in
self.revertimageview2.image = image
var size = CGSize(width: self.singlefirstimagepostview.frame.width, height: self.singlefirstimagepostview.frame.height)
UIGraphicsBeginImageContext(size)
let areaSize = CGRect(x: 0, y: 0, width: size.width/2, height: size.height)
self.revertimageview.image!.drawInRect(areaSize)
let areaSize2 = CGRect(x: size.width/2, y: 0, width: size.width/2, height: size.height)
self.revertimageview2.image!.drawInRect(areaSize2, blendMode: kCGBlendModeNormal, alpha: 1)
var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.singlefirstimagepostview.image = newImage
}
}
如何让它在左侧显示图像 1 的中心部分,在右侧显示图像 2 的中心部分?
例如,图像 1 是我正在组合的 2 个图像。图 2 是当前的样子(两个图像都被压扁了)。图 3 是我想要的样子。
您需要先拆分图像,然后再将其组合回去。下面是我从其他问题中找到的分割图像的代码:
在调查您的问题时,我偶然发现了这个旧博客 post,其中有人为此类操作写了一个类别。
http://iphonedevelopment.blogspot.nl/2010/11/drawing-part-of-uiimage.html
我基于那个 post 快速写了一个 UIImage 扩展。
extension UIImage {
func drawInRect(drawRect: CGRect, fromRect: CGRect, blendMode: CGBlendMode, alpha: CGFloat) {
if let imageToDraw = CGImageCreateWithImageInRect(self.CGImage, fromRect){
var targetRect = drawRect
let context = UIGraphicsGetCurrentContext()
CGContextSaveGState(context)
CGContextSetBlendMode(context, blendMode)
CGContextSetAlpha(context, alpha)
CGContextTranslateCTM(context, 0, drawRect.origin.y + fromRect.size.height)
CGContextScaleCTM(context, 1, -1)
targetRect.origin.y = 0
CGContextDrawImage(context, targetRect, imageToDraw)
CGContextRestoreGState(context)
}
}
}
您可以像下面那样使用它,它也负责 Retina 设备的缩放。在此示例中,我只是切换了同一图像的两半,但您当然可以使用相同的扩展来创建多个图像的裁剪部分。
let image = UIImage(named: "my_image")!
let imageView = UIImageView(frame: CGRectMake(0, 0, image.size.width, image.size.height))
let size = CGSizeMake(image.size.width * image.scale, image.size.height * image.scale)
UIGraphicsBeginImageContextWithOptions(size, false, image.scale)
// Draws second half of image in first half
image.drawInRect(
CGRectMake(0, 0, size.width / 2, size.height),
fromRect: CGRectMake(size.width / 2, 0, size.width / 2, size.height),
blendMode: kCGBlendModeNormal,
alpha: 1)
// Draws first half of image in second half
image.drawInRect(
CGRectMake(size.width / 2, 0, size.width / 2, size.height),
fromRect: CGRectMake(0, 0, size.width / 2, size.height),
blendMode: kCGBlendModeNormal,
alpha: 1)
var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
imageView.image = newImage
想通了。
var size = CGSize(width: self.singlefirstimagepostview.frame.width, height: self.singlefirstimagepostview.frame.height)
UIGraphicsBeginImageContext(size)
let areaSize = CGRect(x: 0, y: 0, width: size.width/2, height: size.height)
var leftimage = CGImageCreateWithImageInRect(self.revertimageview.image!.CGImage, CGRectMake(self.revertimageview.image!.size.width*0.25, 0, self.revertimageview.image!.size.width/2 , self.revertimageview.image!.size.height))
var rightimage = CGImageCreateWithImageInRect(self.revertimageview2.image!.CGImage, CGRectMake(self.revertimageview2.image!.size.width*0.25, 0, self.revertimageview2.image!.size.width/2 , self.revertimageview2.image!.size.height))
let leftyimage = UIImage(CGImage: leftimage)
let rightyimage = UIImage(CGImage: rightimage)
//self.revertimageview.image!.drawInRect(areaSize)
leftyimage!.drawInRect(areaSize)
let areaSize2 = CGRect(x: size.width/2, y: 0, width: size.width/2, height: size.height)
//self.revertimageview2.image!.drawInRect(areaSize2, blendMode: kCGBlendModeNormal, alpha: 1)
rightyimage!.drawInRect(areaSize2, blendMode: kCGBlendModeNormal, alpha: 1)
var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.singlefirstimagepostview.image = newImage
我有一个方形图像视图,如果用户决定添加另一张图像,它会进入右侧的同一图像视图。所以图像视图的左半部分是图像 1,右半部分是图像 2。我的代码唯一的问题是它将两个图像都压缩到图像视图中。
@IBAction func secondactiontakepicture(sender: AnyObject) {
ImagePickerManager.sharedManager.presentImagePicker(self) { (image, source) -> () in
self.revertimageview2.image = image
var size = CGSize(width: self.singlefirstimagepostview.frame.width, height: self.singlefirstimagepostview.frame.height)
UIGraphicsBeginImageContext(size)
let areaSize = CGRect(x: 0, y: 0, width: size.width/2, height: size.height)
self.revertimageview.image!.drawInRect(areaSize)
let areaSize2 = CGRect(x: size.width/2, y: 0, width: size.width/2, height: size.height)
self.revertimageview2.image!.drawInRect(areaSize2, blendMode: kCGBlendModeNormal, alpha: 1)
var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.singlefirstimagepostview.image = newImage
}
}
如何让它在左侧显示图像 1 的中心部分,在右侧显示图像 2 的中心部分?
例如,图像 1 是我正在组合的 2 个图像。图 2 是当前的样子(两个图像都被压扁了)。图 3 是我想要的样子。
您需要先拆分图像,然后再将其组合回去。下面是我从其他问题中找到的分割图像的代码:
在调查您的问题时,我偶然发现了这个旧博客 post,其中有人为此类操作写了一个类别。
http://iphonedevelopment.blogspot.nl/2010/11/drawing-part-of-uiimage.html
我基于那个 post 快速写了一个 UIImage 扩展。
extension UIImage {
func drawInRect(drawRect: CGRect, fromRect: CGRect, blendMode: CGBlendMode, alpha: CGFloat) {
if let imageToDraw = CGImageCreateWithImageInRect(self.CGImage, fromRect){
var targetRect = drawRect
let context = UIGraphicsGetCurrentContext()
CGContextSaveGState(context)
CGContextSetBlendMode(context, blendMode)
CGContextSetAlpha(context, alpha)
CGContextTranslateCTM(context, 0, drawRect.origin.y + fromRect.size.height)
CGContextScaleCTM(context, 1, -1)
targetRect.origin.y = 0
CGContextDrawImage(context, targetRect, imageToDraw)
CGContextRestoreGState(context)
}
}
}
您可以像下面那样使用它,它也负责 Retina 设备的缩放。在此示例中,我只是切换了同一图像的两半,但您当然可以使用相同的扩展来创建多个图像的裁剪部分。
let image = UIImage(named: "my_image")!
let imageView = UIImageView(frame: CGRectMake(0, 0, image.size.width, image.size.height))
let size = CGSizeMake(image.size.width * image.scale, image.size.height * image.scale)
UIGraphicsBeginImageContextWithOptions(size, false, image.scale)
// Draws second half of image in first half
image.drawInRect(
CGRectMake(0, 0, size.width / 2, size.height),
fromRect: CGRectMake(size.width / 2, 0, size.width / 2, size.height),
blendMode: kCGBlendModeNormal,
alpha: 1)
// Draws first half of image in second half
image.drawInRect(
CGRectMake(size.width / 2, 0, size.width / 2, size.height),
fromRect: CGRectMake(0, 0, size.width / 2, size.height),
blendMode: kCGBlendModeNormal,
alpha: 1)
var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
imageView.image = newImage
想通了。
var size = CGSize(width: self.singlefirstimagepostview.frame.width, height: self.singlefirstimagepostview.frame.height)
UIGraphicsBeginImageContext(size)
let areaSize = CGRect(x: 0, y: 0, width: size.width/2, height: size.height)
var leftimage = CGImageCreateWithImageInRect(self.revertimageview.image!.CGImage, CGRectMake(self.revertimageview.image!.size.width*0.25, 0, self.revertimageview.image!.size.width/2 , self.revertimageview.image!.size.height))
var rightimage = CGImageCreateWithImageInRect(self.revertimageview2.image!.CGImage, CGRectMake(self.revertimageview2.image!.size.width*0.25, 0, self.revertimageview2.image!.size.width/2 , self.revertimageview2.image!.size.height))
let leftyimage = UIImage(CGImage: leftimage)
let rightyimage = UIImage(CGImage: rightimage)
//self.revertimageview.image!.drawInRect(areaSize)
leftyimage!.drawInRect(areaSize)
let areaSize2 = CGRect(x: size.width/2, y: 0, width: size.width/2, height: size.height)
//self.revertimageview2.image!.drawInRect(areaSize2, blendMode: kCGBlendModeNormal, alpha: 1)
rightyimage!.drawInRect(areaSize2, blendMode: kCGBlendModeNormal, alpha: 1)
var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.singlefirstimagepostview.image = newImage