2016-09-15 16 views
0

I有しアプリで機能次は異なる結果を与える

ユーザが画像(以下 originalImage)をとる(又は選択)
  1. originalImageは、いくつかの外部APIに送られます。これは、追加する点の座標の配列をoriginalImageに返します。
  2. ドットは常に1つの領域(顔)に配置されているため、顔の枠線の近くにあるoriginalImageをクロップして、ユーザーにクロップの結果のみを表示します。
  3. クロップ結果が表示されたら、それに1つずつドットを追加します。ここで

仕事をしていませんコード(画像を送信する以外、のは、それはすでに起こっているとしましょう)

class ScanResultViewController{ 

    @IBOutlet weak var scanPreviewImageView: UIImageView! 

    let originalImage = ORIGINAL_IMAGE //meaning we already have it 

    let scanDots = [["x":123, "y":123], ["x":234, "y":234]]//total 68 coordinates 

    var cropRect:CGRect! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.setScanImage() 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 

     self.animateScan(0) 
    } 


    func setScanImage(){ 

     self.cropRect = self.getCropRect(self.scanDots, sourceImage:self.originalImage) 

     let croppedImage = self.originalImage.imageAtRect(self.cropRect) 

     self.scanPreviewImageView.image = croppedImage 
     self.scanPreviewImageView.contentMode = .ScaleAspectFill 

    } 


    func animateScan(index:Int){ 

     let i = index 

     self.originalImage = self.addOnePointToImage(self.originalImage, pointImage: GREEN_DOT!, point: self.scanDots[i]) 

     let croppedImage = self.originalImage.imageAtRect(self.cropRect) 

     self.scanPreviewImageView.image = croppedImage 
     self.scanPreviewImageView.contentMode = .ScaleAspectFill 

     if i < self.scanDots.count-1{ 

      let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) 
      dispatch_after(delay, dispatch_get_main_queue()) { 

       self.animateScan(i+1) 
      } 
     } 
    } 


    func addOnePointToImage(sourceImage:UIImage, pointImage:UIImage, point: Dictionary<String,CGFloat>)->UIImage{ 

     let rect = CGRect(x: 0, y: 0, width: sourceImage.size.width, height: sourceImage.size.height) 

     UIGraphicsBeginImageContextWithOptions(sourceImage.size, true, 0) 
     let context = UIGraphicsGetCurrentContext() 

     CGContextSetFillColorWithColor(context, UIColor.whiteColor().CGColor) 
     CGContextFillRect(context, rect) 

     sourceImage.drawInRect(rect, blendMode: .Normal, alpha: 1) 

     let pointWidth = sourceImage.size.width/66.7 

     pointImage.drawInRect(CGRectMake(point["x"]!-pointWidth/2, point["y"]!-pointWidth/2, pointWidth, pointWidth), blendMode: .Normal, alpha: 1) 

     let result = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return result 
    } 


    func getCropRect(points: Array<Dictionary<String,CGFloat>>, sourceImage:UIImage)->CGRect{ 

     var topLeft:CGPoint = CGPoint(x: points[0]["x"]!, y: points[0]["y"]!) 
     var topRight:CGPoint = CGPoint(x: points[0]["x"]!, y: points[0]["y"]!) 
     var bottomLeft:CGPoint = CGPoint(x: points[0]["x"]!, y: points[0]["y"]!) 
     var bottomRight:CGPoint = CGPoint(x: points[0]["x"]!, y: points[0]["y"]!) 

     for p in points{ 

      if p["x"]<topLeft.x {topLeft.x = p["x"]!} 
      if p["y"]<topLeft.y {topLeft.y = p["y"]!} 

      if p["x"]>topRight.x {topRight.x = p["x"]!} 
      if p["y"]<topRight.y {topRight.y = p["y"]!} 

      if p["x"]<bottomLeft.x {bottomLeft.x = p["x"]!} 
      if p["y"]>bottomLeft.y {bottomLeft.y = p["y"]!} 

      if p["x"]>bottomRight.x {bottomRight.x = p["x"]!} 
      if p["y"]>bottomRight.y {bottomRight.y = p["y"]!} 

     } 

     let rect = CGRect(x: topLeft.x, y: topLeft.y, width: (topRight.x-topLeft.x), height: (bottomLeft.y-topLeft.y)) 

     return rect 
    } 

} 

extension UIImage{ 

    public func imageAtRect(rect: CGRect) -> UIImage { 
     let imageRef: CGImageRef = CGImageCreateWithImageInRect(self.CGImage, rect)! 
     let subImage: UIImage = UIImage(CGImage: imageRef) 

     return subImage 
    } 

} 

問題は、setScanImageで所望の領域を正確にトリミングされて表示されていることですanimateScanメソッドが呼び出されると、cropRectは同じですが、同じ画像の別の領域が切り取られ(表示され)、originalImageのサイズは全く同じです。

どのようなアイデアですか?

ところで、私がoriginalImageをトリミングせずに表示すると、すべてがスムーズに機能します。

答えて

0

だから、最終的には約10時間後の正味時間( と私は問題を解決するために管理:-) StackOverflowのコミュニティ の多くの援助:

次を変更する必要がある機能addOnePointToImageで:

この行で

UIGraphicsBeginImageContextWithOptions(sourceImage.size, true, 0) 

あなたは1に(規模の略)最後の引数を変更する必要があります。

UIGraphicsBeginImageContextWithOptions(sourceImage.size, true, 1) 

これは完全に問題を解決します。

関連する問題