[解決済み] iOSでプログラム的に画像を着色するには?
質問
カラーリファレンスで画像を着色したい。結果は、Photoshopの乗算ブレンドモードのようになるはずです。 白 に置き換えられます。 色合い :
色の値を連続的に変えていきます。
フォローします。 ImageViewのdrawRect:メソッドにこれを行うコードを記述しますよね?
いつものように コードスニペット は、リンクとは対照的に、私の理解を大いに助けてくれるでしょう。
更新しました。 UIImageViewをサブクラス化するコードで ラミン を提案しました。
私はこれをビューコントローラのviewDidLoad:に置きました。
[self.lena setImage:[UIImage imageNamed:kImageName]];
[self.lena setOverlayColor:[UIColor blueColor]];
[super viewDidLoad];
画像は表示されるのですが、色合いが変わりません。また、他の画像を読み込み、IBで画像を設定し、ビューコントローラーでsetNeedsDisplay:を呼び出してみました。
更新する : drawRect: は呼び出されていません。
最終更新です。 私は、Raminのコードをテストできるように、適切に設定されたimageViewを持つ古いプロジェクトを見つけ、それは魅力のように動作します!
最終的な、最終的なアップデートです。
Core Graphics について学び始めたばかりの方のために、最もシンプルに動作しそうなものを紹介します。
サブクラス化した UIView で。
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColor(context, CGColorGetComponents([UIColor colorWithRed:0.5 green:0.5 blue:0 alpha:1].CGColor)); // don't make color too saturated
CGContextFillRect(context, rect); // draw base
[[UIImage imageNamed:@"someImage.png"] drawInRect: rect blendMode:kCGBlendModeOverlay alpha:1.0]; // draw image
}
どのように解決するのですか?
まず、UIImageViewをサブクラス化し、drawRectメソッドをオーバーライドしたいと思います。クラスには、ブレンド カラーを保持する UIColor プロパティ (overlayColor と呼ぶことにします) と、色が変更されたときに再描画を強制するカスタム セッターを必要とします。このようなものです。
- (void) setOverlayColor:(UIColor *)newColor {
if (overlayColor)
[overlayColor release];
overlayColor = [newColor retain];
[self setNeedsDisplay]; // fires off drawRect each time color changes
}
drawRectメソッドでは、まず画像を描いてから、適切なブレンディングモードで好きな色で塗りつぶした矩形でオーバーレイするようにしたいでしょう。
- (void) drawRect:(CGRect)area
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
// Draw picture first
//
CGContextDrawImage(context, self.frame, self.image.CGImage);
// Blend mode could be any of CGBlendMode values. Now draw filled rectangle
// over top of image.
//
CGContextSetBlendMode (context, kCGBlendModeMultiply);
CGContextSetFillColor(context, CGColorGetComponents(self.overlayColor.CGColor));
CGContextFillRect (context, self.bounds);
CGContextRestoreGState(context);
}
通常、描画を最適化するためには、drawRectに渡された領域のみに実際の描画を制限しますが、背景画像は色が変わるたびに再描画しなければならないので、全体の更新が必要になる可能性が高いです。
これを使うには、オブジェクトのインスタンスを作成して
image
プロパティ (UIImageView から継承) に画像と
overlayColor
をUIColorの値に変換します(ブレンドレベルは、渡す色のアルファ値を変更することで調整できます)。
関連
-
[解決済み】Xcode - 'NSUnknownKeyException', reason: ... this class is not key value coding-compliant for the key X" エラーの修正方法とは?
-
[解決済み] Mathematica でWaldoを見つけるにはどうしたらよいですか.
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] アンドロイドでプログラム的にイメージビューの色合いを設定する方法は?
-
[解決済み] UIViewの角丸とドロップシャドウ?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】iOSアプリの名前を変更する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] UITableViewの下にある余分なセパレータをなくす
-
[解決済み] フレームワークを使用したiOSアプリがデバイス上でクラッシュ、dyld: ライブラリがロードされない、Xcode 6 Beta
-
[解決済み] Unwind segueは何に使うのか、どう使うのか?
-
[解決済み] UITextViewのサイズをコンテンツに合わせるには?
-
[解決済み] UINavigationBarの1px下の行を非表示にする方法
-
[解決済み] iPhone 5の画面解像度に対応したアプリを開発・移行するには?
-
[解決済み] Swift 3, 4, 5 で dispatch_after GCD を書くにはどうしたらいいですか?
-
[解決済み] インポート vs #インポート - iOS 7
-
[解決済み] UIImageのサイズを変更する最も簡単な方法?
-
[解決済み] UIImageを90度回転させるには?