1. ホーム
  2. ios

[解決済み] iOSでプログラム的に画像を着色するには?

2023-05-21 11:26:37

質問

カラーリファレンスで画像を着色したい。結果は、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の値に変換します(ブレンドレベルは、渡す色のアルファ値を変更することで調整できます)。