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

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

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

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

Swift

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

Q&A

解決済

2回答

675閲覧

UIImageのリサイズで画像に透過がかかってしまう

po_tato

総合スコア97

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/04/24 10:07

編集2018/04/25 02:18

アプリのナビゲーションバーの部分に更新機能ボタンを実装しているのですが、そちらをリサイズしようとするとリサイズは出来ているのですが、"UIGraphicsBeginImageContextWithOptions"
このせいなのかなぜか画像が半透明みたいになります。
一応、第2引数をfalseにしているので透過は入らないはずなのですが、
なぜこのようになるのでしょうか?

追記:
最初にopaque=trueにしたのですが、画像のシルエットだけ見えるようになったので、falseに変更し画像は確認できるものの透過がかかり薄く表示されてしまうことが解決出来ず質問させていただきました。

let rightButton = UIBarButtonItem() rightButton.image = UIImage(named: "reload.png")?.withRenderingMode(UIImageRenderingMode.alwaysOriginal).ResizeUIImage(width: 60, height: 30) self.navigationItem.rightBarButtonItem = rightButton rightButton.action = #selector(SecondViewController.reload(_:)) rightButton.target = self
extension UIImage{ // 画質を担保したままResizeするクラスメソッド. func ResizeUIImage(width : CGFloat, height : CGFloat)-> UIImage!{ let size = CGSize(width: width, height: height) UIGraphicsBeginImageContextWithOptions(size, false, 0.0) _ = UIGraphicsGetCurrentContext() self.draw(in: CGRect(x:0, y:0, width:size.width, height:size.height)) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } }

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

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

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

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

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

fuzzball

2018/04/25 02:11

タブバーではなくナビゲーションバーでしょうか?
po_tato

2018/04/25 02:30

その通りです。修正いたしました!
guest

回答2

0

ベストアンサー

画像が半透明みたいになります

これがよく分からないのですが、やりたいことは、画像を60x30にリサイズして、(単色表示ではなく)そのまま表示させたいということでしょうか?

とりあえず、リサイズとレンダリングモードの指定が逆なので順番を入れ替えて下さい。

swift

1rightButton.image = UIImage(named: "reload.png")?.ResizeUIImage(width: 60, height: 30).withRenderingMode(UIImageRenderingMode.alwaysOriginal)

半透明なのは、元画像が半透明だからではないですか?

投稿2018/04/25 02:45

fuzzball

総合スコア16731

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

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

po_tato

2018/04/25 03:36

元画像は半透明ではありません。 ご教示いただきました通り、順番を入れ替えただけで正常に動作しました。 ありがとうございました!
guest

0

逆です。UIGraphicsBeginImageContextWithOptionsの第2引数はopaque(不透明)ならtrueです。
あとreload.pngは半透明な部分を全く含まない画像なんでしょうか?
そうでない場合はself.drawの前に画像を特定の色で塗りつぶしてやる必要があります。

投稿2018/04/24 12:51

toki_td

総合スコア2850

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

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

po_tato

2018/04/25 01:45

ご返答ありがとうございます! reload.pngは透過を含みます。ですので、falseでよろしいのでしょうか? また塗り潰しから試してみようとして、このように変更してみても塗り潰しも出来ずに 半透明のままになってしまっているのはなぜなのでしょうか? お分かりでしたらご教示お願い致します。 ``` let rightButton = UIBarButtonItem() rightButton.image = UIImage(named: "reload2.png")?.withRenderingMode(UIImageRenderingMode.alwaysOriginal).tint(color: .white) self.navigationItem.rightBarButtonItem = rightButton rightButton.action = #selector(SecondViewController.reload(_:)) rightButton.target = self ``` ``` extension UIImage { func tint(color: UIColor) -> UIImage { UIGraphicsBeginImageContextWithOptions(size, false, 0) color.setFill() let drawRect = CGRect(x: 0, y: 0, width: size.width, height: size.height) UIRectFill(drawRect) draw(in: drawRect, blendMode: .destinationIn, alpha: 1) let tintedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return tintedImage! } } ```
fuzzball

2018/04/25 01:57 編集

とりあえず、元のコードのままで opaque = true にしてみてはどうでしょうか?(なぜ試さずに質問するのでしょうか?)
po_tato

2018/04/25 02:06

もちろん試しました。 半透明ではないですが、画像のシルエットだけ確認できるような感じになり、opaque = falseにしたら半透明ながらも画像自体は確認できるくらいになったので、そこから解決することが出来ず今回質問させていただいた次第です。
fuzzball

2018/04/25 02:38 編集

試したことは質問内に書いて下さい。(回答者はエスパーばかりではないので)
po_tato

2018/04/25 02:18

追記致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問