- ベストアンサー
Objective-Cで写真を消しゴムツールのように消したい
- Objective-Cで写真を読み込み、一部を消す方法を教えてください。
- 参考にさせていただいたお絵かきするアプリを参考にしており、写真を読み込む部分までは実装済みですが、お絵描きする際に写真が消えてしまいます。
- 黒で描画部分を消しゴムツールにするために、いくつかの変更を加えましたが、うまく動作しません。解決方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 > イメージしている消しゴムツールは、指でなぞったところの写真イメージを消し、透明にしたいと考えています。 > undoは消したくない部分を消したときに戻すのに使いたいと考えています。 であれば、今のやり方で問題ないと思います。 試しに参考にしたプログラムを実際に私の方でも作ってみて描画色指定部分に CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear); を追加してみたら、ちゃんと透明色で塗られましたよ。 ちなみに、kCGBlendModeClearを設定したら、 描画色に何を指定しても透明で塗られます。 [[UIColor blackColor] setStroke]; のままでも透明で塗られます。 作ったプログラムを全部貼り付けなくてもdrawLineメソッドだけでも 開示すれば何かアドバイスできるかもしれません。
その他の回答 (2)
- Lchan0211b
- ベストアンサー率61% (573/930)
No.1です。 > なぜか最初にタッチした部分が拡大表示されるようになりました。 参考にしたプログラムのどこをどうさわったかわかりませんが、 説明されているところ以外変更してないのだったら、 まぁそうなるだろうなと思います。 前回の質問と同じようにself.canvasのサイズよりも 読み込んだ写真のサイズの方が大きければ、その写真は self.canvas内で実際のサイズより縮小して表示されます。 一方、タッチ開始後の描画では、drawLineメソッドの [lastDrawImage drawAtPoint:CGPointZero]; の処理で、lastDrawImageに入っている写真イメージを描画しますが この描画方法は元の画像サイズのはみ出た部分を切り捨てる 方法ですので、大きな画像の左上の部分だけが拡大しして 表示されるように見えると思います。 ここを [lastDrawImage drawInRect:self.canvas.bounds]; とすれば、lastDrawImage描画もcanvasに合わせたサイズに 縮小されると思います。 > また、CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);や[[UIColor colorWithRed:0 green:0 blue:0 alpha:0.0f] setStroke];の設定がおかしいのか、消しゴムツールにはなりません。 消しゴムツールって、どんな動作をすることを期待しているのですか? kCGBlendModeClearで描画すれば、その描画部分は透明色で塗られるので なぞったところの写真イメージが消えます。 参考にしたプログラムなら、canvasの下地のviewがたぶん白なので なぞったところが白くなったなら、kCGBlendModeClear指定は 正しく動作していると思います。 そうじゃなくて、自分で描いた線を消しゴムツールでなぞることで なぞったところの線が消え、元の写真イメージが復元されることを 期待しているのでしたら、読み込んだ写真イメージをcanvas.imageに 設定するのではなく、別のimageViewを作ってcanvasの下に その写真を敷けばよいです。 ただ、参考にしたプログラムは、消しゴムツールの替わりにundo機能を 持っていて、描画したのと逆の順に線を消していくことができるように なっています。それを知った上で消しゴムツールも作りたいということ なのでしょうか?
お礼
ありがとうございます。勉強になります。
補足
イメージしている消しゴムツールは、指でなぞったところの写真イメージを消し、透明にしたいと考えています。 undoは消したくない部分を消したときに戻すのに使いたいと考えています。 しかし、写真イメージに何もおこりません。なぞったところに透明な色がぬられてる?写真イメージの下に写真イメージが重なっている?など考えてみましたが、分かりませんでした。色を黒にしたら写真イメージの上に線は引けます。プログラミングの記述が、字数的に見てもらえないので、分かり難いですが、よろしくお願いします。
- Lchan0211b
- ベストアンサー率61% (573/930)
> お絵描きするためにUIImageviewをタッチすると写真が消えてしまいます。 参考にしたプログラムをざっと見ると、線を描く処理は、 lastDrawImageの画像を書いてその上にタッチした線を書いて、 それをself.canvas.imageに設定するようになっていますが、 読み込んだ写真はself.canvas.imageだけでなくlastDrawImageにも 設定していますか?
お礼
毎回、素早く、的確なご指導ありがとうございます。
補足
教えていただいたように、読み込んだ写真をself.canvas.imageだけでなくlastDrawImageにも設定したら、消えなくなりました。しかし、なぜか最初にタッチした部分が拡大表示 されるようになりました。拡大になるような部分はないように思うのですが また、CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);や[[UIColor colorWithRed:0 green:0 blue:0 alpha:0.0f] setStroke];の設定がおかしいのか、消しゴムツールにはなりません。この部分はhttp://realisapp.com/iphone/coregraphics-paint/を参考にしてのですが、無理矢理くっつけてしまいました。 質問ばかりで申し訳ありません。ご指導よろしくお願いします。
お礼
ありがとうございました。教えてもらったように描画色指定部分に CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);をしていすると、消しゴムツールのようになりました。これを各部分が間違ってました。試しにプログラムを実際に作り、検証していただき本当に感謝しています。たいへん勉強になりました。ありがとうございました。また、機会があれば、よろしくお願いします。