2016-04-26 13 views
1

私はの画像をの背景から消去して、ユーザーが"カメラロール"からインポートするようにアプリを作ろうとしています。
私はUICmageでUIColor.clearColorを描く手を考えていました。 私は私のUIImageで描画するためにコアグラフィックスを使用してみました。問題は、それは非常にラグだったということですSwiftの画像を消去する最も良い方法は?

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    if let touch = touches.first { 
     lastPoint = touch.locationInView(self) 
    } 
} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    if let touch = touches.first { 
     var newPoint = touch.locationInView(self) 
     lines.append(Line(start: lastPoint, end: newPoint)) 
     lastPoint = newPoint 
     self.setNeedsDisplay() 
    } 
} 

override func drawRect(rect: CGRect) { 
    imageToSend.drawAtPoint(CGPointZero) 
    var context = UIGraphicsGetCurrentContext() 
    CGContextBeginPath(context) 
    for line in lines { 
     CGContextMoveToPoint(context, line.start.x, line.start.y) 
     CGContextAddLineToPoint(context, line.end.x, line.end.y) 
    } 
    CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor) //tried with a red color here 
    CGContextSetLineWidth(context, 80.0) 
    CGContextSetLineCap(context, .Round) 
} 


は私がで線を描画するために最初に試みました。
(xCodeの)デバッグセッションでのメモリ使用量は、CPU使用率と同様に非常に高かった。
iPhone 6sでアプリを実行する。
Swiftの画像を消去する方がいいですか?
もう一つの問題は、それが線を作成することです、私はより滑らかにしたいと思います。しかし、それは別の問題です

+0

私は、パフォーマンスラグは* drawRect *メソッドの頻繁な呼び出しによって発生すると仮定しています。あなたはそこで本当に巨大な仕事をしています。以下を削除することを検討してください:* imageToSend.drawAtPoint(CGPointZero)*。コメントアウトして、パフォーマンスが向上するかどうかを確認してください。それが役立つ場合は、UIImageViewを上に描画するカスタムビューでギャラリーからのイメージでオーバーレイしようとすることができます。興味深い問題ですが、サンプルコードを共有した場合は、そのコードで試してみます。 –

+0

@Melifaroはい、それは良くなります。だから私はUIImageViewの上に私のDrawingViewを置く必要がありますか?どうすればイメージを消去できますか?ヘルプありがとう – Danny182

答えて

1

私の前提はパフォーマンスの遅れがdrawRectメソッドの頻繁な呼び出しによって引き起こされたということです。これはコードスニペットレンダリングイメージでは非常に大きな作業です。アイデアは、選択領域描画ビューで画像を含むUIImageViewをオーバーレイすることでした。これは、画像ビューの上に描画を行います。それで、イメージ描画から領域描画を分離できるようにすべきです。その結果、資源を著しく消費する(画像描画)操作は1回だけ実行する必要があります。私は、あなたがここに私のサンプルアプリケーションをチェックアウトすることができ、これを実装した

https://github.com/melifaro-/CutImageSampleApp

enter image description here

UPDATEを使用すると、ベジエパスを持っていたら、画像をトリミングするのは簡単です

あなたのイメージに対応します。あなただけが必要です:

let croppedCGImage = CGImageCreateWithImageInRect(image.CGImage!, CGPathGetPathBoundingBox(path.CGPath)); 
let croppedImage = UIImage(CGImage: croppedCGImage!) 

サンプルアプリケーションの変更もプッシュしました。それが役に立てば幸い。

+0

うわー!それは完璧だ。ありがとうございました!私は画像の残りの透明部分を削除する方法を探しています。これで、すべてのイメージが「緑色」の線から保存されます。私は小さい画像をしたい – Danny182

+0

ありがとう、私はそれを試してみましょう。 _line_の代わりに_addCurveToPoint_を使用して行をよりスムーズにするコードを改善しました – Danny182

+0

@ Danny182ありがとう、面白い質問です –

関連する問題