2015-09-04 44 views
1

我到處搜索並找到了一些關於如何掩蓋圖像的例子,但它們都不適合我...我在iOS9上運行並使用Swift2.0在Swift 2.0中掩蓋圖像

現在這就是我:

class func maskImage(background: UIImage, withMask mask: UIImage) -> UIImage { 

    let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedLast.rawValue).rawValue 
    let colorSpace = CGColorSpaceCreateDeviceRGB()! 
    let context = CGBitmapContextCreate(nil, CGImageGetWidth(mask.CGImage), CGImageGetHeight(mask.CGImage), 8, 0, colorSpace, bitmapInfo) 

    CGContextDrawImage(context, CGRectMake(0, 0, mask.size.width * mask.scale, mask.size.height * mask.scale), mask.CGImage) 

    let maskRef: CGImageRef = CGBitmapContextCreateImage(context)! 
    let masked: CGImageRef = CGImageCreateWithMask(background.CGImage, maskRef)! 

    let icon: UIImage = UIImage(CGImage: masked, scale: mask.scale, orientation: mask.imageOrientation) 

    return icon 
} 

我傳遞兩個PNG文件並得到錯誤:EXC_BAD_INSTRUCTION在哪裏我初始化屏蔽線。我沒有足夠的代表發佈圖片。

我可能錯過了一些超級簡單的東西,但會愛上你的幫助。謝謝!

+0

你只是想改變圖像的顏色爲純色? – aasatt

+0

我正在嘗試合併一個配置文件圖像(90x90)並用菱形框掩蓋它。 –

回答

0

我也在運行最新版本,並且遇到了很多麻煩。我終於能夠使用下面的代碼來裁剪圖像的一部分,並用圖像蒙版覆蓋拼圖。

import UIKit 
import CoreGraphics 

class ViewController2: UIViewController { 

@IBOutlet var imageView: UIImageView! 

var p1PosX: CGFloat = 0.0 
var p1PosY: CGFloat = 0.0 
var p1Width: CGFloat = 0.0 
var p1Height: CGFloat = 0.0 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let panda = UIImage(named: "panda.jpeg")! 
    let puzzle1 = UIImage(named: "PP-4-1.gif")! 

    //Crop 
    let contextSize: CGSize = panda.size 
    let rect = CGRect(x: 0, y: 0, width: 200, height: 200) 

    p1PosX = 0 
    p1PosY = 0 
    p1Width = contextSize.width/2 
    p1Height = contextSize.height/2 
    let rect1: CGRect = CGRectMake(p1PosX, p1PosY, 350, 350) 
    let imageRef1: CGImageRef = CGImageCreateWithImageInRect(panda.CGImage, rect1)! 
    let panda1: UIImage = UIImage(CGImage: imageRef1, scale: panda.scale, orientation: panda.imageOrientation) 
    imageView.image = panda1 

    //Mask 
    UIGraphicsBeginImageContext(imageView.frame.size) 
    panda1.drawInRect(rect) 
    puzzle1.drawInRect(CGRectMake(0, 0, imageView.frame.size.width , imageView.frame.size.height), blendMode: CGBlendMode.DestinationIn, alpha: 1.0) 
    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    imageView.image = newImage 
    } 
} 
0

如果有人絆倒了相同的情況,並尋找一個乾淨的解決方案,這裏有一個函數來掩蓋圖像。它適用於.jpg,.png和.gif圖像。

func maskImage(image:UIImage, mask:(UIImage))->UIImage{ 

    let imageReference = image.CGImage 
    let maskReference = mask.CGImage 

    let imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference), 
             CGImageGetHeight(maskReference), 
             CGImageGetBitsPerComponent(maskReference), 
             CGImageGetBitsPerPixel(maskReference), 
             CGImageGetBytesPerRow(maskReference), 
             CGImageGetDataProvider(maskReference), nil, true) 

    let maskedReference = CGImageCreateWithMask(imageReference, imageMask) 

    let maskedImage = UIImage(CGImage:maskedReference!) 

    return maskedImage 
} 

在您的viewDidLoad()或init()添加以下報關行需要:

let image = UIImage(named: "image.png") 
let maskingImage = UIImage(named: "mask.png") 
let imageView = UIImageView(image: maskingImage) 
imageView.image = maskImage(image!, mask: maskingImage!) 

感謝和Manish Kumar的解決方案Implementing Image Masking in iOS

1

與SWIFT 3.0,我們有偉大的名字改變.... 所以這似乎現在功能後,一些重命名...和清洗... 基於此示例:(https://www.innofied.com/implementing-image-masking-in-ios/

 func maskImage(image:UIImage, mask:UIImage)->UIImage{ 

      let imageReference = (image.cgImage)! 
      let maskReference = (mask.cgImage)! 

      let imageMask = CGImage.init(
       maskWidth: maskReference.width 
       ,height: maskReference.height 
       ,bitsPerComponent: maskReference.bitsPerComponent 
       ,bitsPerPixel: maskReference.bitsPerPixel 
       ,bytesPerRow: maskReference.bytesPerRow 
       ,provider: maskReference.dataProvider! 
       ,decode: nil 
       ,shouldInterpolate: true 
      ) 


      return (UIImage(cgImage:(imageReference.masking(imageMask!))!)) 
     }