質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

5539閲覧

AVFoundationとフロントカメラを利用時、左右反転した画像がカメラロールに保存されてしまう。

acid

総合スコア20

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

0クリップ

投稿2016/01/28 09:24

swift歴2ヶ月の初心者です。はじめて質問させていただきます。
現在swiftとxcodeとAVFoudationを使ってスタンプカメラアプリを作成中です。
下記の問題点に関して、質問させていただきます。

問題点:AVFoudationを使用してiPhoneの前面カメラ(フロントカメラ)で撮影した際に、
カメラロール内に保存された画像が左右反転の状態で保存されてしまう。

質問:AVFoudationとフロントカメラ利用時、左右反転させないで画像を保存させるには、どういったコーディングをすべきなのでしょうか?

補足:自撮りしたいため、フロントカメラを利用しています。
UIKitだけだと、撮影ボタンなどをカスタマイズできないような気がしたため
AVFoundationも利用しています。
左右反転の回避策を数日調べてみたのですが、うまく見つけられませんでした。
お手数ではございますが、よろしくお願い致します。

hidehara👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

保存する前にUIImageを左右反転してあげればいいと思います。

左右反転する方法は
http://temping-amagramer.blogspot.jp/2013/10/iosobjective-cuiimage.html?m=1
これとか参考にすればどうでしょう。

追記
試してみると想像以上に難しいものでした。

それにすみません。提示した参考サイトを元に自分でやってみるとうまく反転しませんでした。
多分OSバージョンが違うからかキャプチャの方法が違うからだと思いますが……

良さげなURLが見つからなかったので自分で実装してみました。
一応手元で試した限りではうまく動くみたいです。

Swift

1func flipHorizontal(image: UIImage) -> UIImage { 2 let originalOrientation = image.imageOrientation 3 4 // UIImageに設定されている回転方向を初期化したUIImageを作成. 5 // 'UIImageOrientation.Up'はホームボタンが右手にある状態. これがデフォルトらしい. 6 let landscapeImage = UIImage(CGImage: image.CGImage!, scale: image.scale, orientation: .Up) 7 8 UIGraphicsBeginImageContextWithOptions(landscapeImage.size, false, landscapeImage.scale) 9 let context = UIGraphicsGetCurrentContext() 10 11 // CGContextDrawImageで描画する場合、左下が原点となる. 12 // 扱いやすい右上を原点とするために上下反転する. 13 CGContextTranslateCTM(context, 0, landscapeImage.size.height) 14 CGContextScaleCTM(context, 1.0, -1.0) 15 16 // 左右を反転する. 17 // 元画像が横向きだったらそのまま左右反転でいいが、縦向きだったら90度回転しているので上下反転する. 18 switch originalOrientation { 19 case .Up, .UpMirrored, .Down, .DownMirrored: 20 // 左右反転 21 CGContextTranslateCTM(context, landscapeImage.size.width, 0) 22 CGContextScaleCTM(context, -1.0, 1.0) 23 case .Left, .LeftMirrored, .Right, .RightMirrored: 24 // 上下反転 25 CGContextTranslateCTM(context, 0, landscapeImage.size.height) 26 CGContextScaleCTM(context, 1.0, -1.0) 27 } 28 // 画像を描画 29 CGContextDrawImage(context, CGRect(origin: CGPoint.zero, size: landscapeImage.size), landscapeImage.CGImage) 30 // 画像取得 31 let flipHorizontalImage = UIGraphicsGetImageFromCurrentImageContext() 32 33 UIGraphicsEndImageContext() 34 35 // 最初に無効にしたUIImageの回転を再設定する 36 return UIImage(CGImage: flipHorizontalImage.CGImage!, scale: flipHorizontalImage.scale, orientation: originalOrientation) 37}

投稿2016/01/28 12:57

編集2016/01/31 15:31
u39ueda

総合スコア950

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

acid

2016/01/28 16:40

アドバイスありがとうございます。 申し訳ないのですが、私自身swiftがきっかけでプログラミングを始めたもので、objctive-Cの記述が分からないです(汗。 しかし、objective-Cをswiftに変換できるサイトもあるようなので、もう少し勉強して実装してみたいと思います。 ありがとうございました。
u39ueda

2016/01/29 00:12

こちらこそswiftのコードを提示できずすみません。 どうしても出来ないようでしたらswiftに書き直して追記します。(今はスマホなんでできませんが)
acid

2016/01/29 03:51

平日はITとは無関係な仕事をしているため、今すぐSwiftの勉強はできないのですが、土日はSwiftの勉強がたっぷりできますので、色々調べながらやってみようと思います。 しかし、それでも分からないという状況になることもありますので、そのときはアドバイス頂きたいです。 ありがとうございます。
acid

2016/01/31 08:42

色々と調べながら挑戦したものの、自己解決できませんでした。 http://qiita.com/ryokosuge/items/9d687872285d843882a8 上記の記事を参考にswiftでコーディングしたのですが、画像は反転するものの、反転させた画像が時計回りに90度回ってしまいます。 自分のコーディングに原因があるのか、もっと別の原因があるのか、分かりません。 初心者すぎて申し訳ないのですが、自分のコードを以下に記載させて頂きます。 func flipHorizontal(stillImage: UIImage) -> UIImage { let rect = view.bounds UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) let imageRef = stillImage.CGImage! let context = UIGraphicsGetCurrentContext() CGContextTranslateCTM(context, rect.size.width, rect.size.height) CGContextScaleCTM(context, -1.0, -1.0) CGContextDrawImage(context, CGRect(x: 0, y: 0, width: rect.size.width, height: rect.size.height), imageRef) let flipHorizontalImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return flipHorizontalImage } また、下記URLの記事のように、時計回りに90度回ってしまうから反時計回りで90度回す方もいるようなのですが、どのように自分のコードに導入すべきなのか分かりません。 http://yutakaseda3216.hatenablog.com/entry/2016/01/14/132300 長文となりまして申し訳ありません。 自分のコードに問題がありましたら、ご教示願います。
u39ueda

2016/01/31 15:36

すみません。自分があげたURLを自分で試したところうまく反転しませんでした。 追記で反転するコードを載せたので試してみてください。 自分で確認した限りではうまく動いています。 どこかにないか探してみましたがどれもうまく反転してくれないんですよね……
acid

2016/01/31 23:01 編集

こちらも追加頂いたコードで動作いたしました。 私のような初心者に丁寧な対応を頂き大変恐縮でございます。 さらなるコード理解に努めてまいりたいと思います。 有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問