UIImage のピクセルカラーを変更する

2012/04/20
画像処理に使えるUIImageのTips10個」を参考に、UIImage のカラーを変更してみます。 UIimageのカラーを変更する場合、UIImageからピクセルを取得し新たな画像を作成してやります。

サンプル

任意の red値でカラーを変更する。
- (UIImage *)changeRImage:(UIImage *)image red:(CGFloat)value {
    CFDataRef cfDataRef = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
    NSData* pixelData = (__bridge NSData*) cfDataRef;
    unsigned char* bitmap = (unsigned char *)[pixelData bytes];
    CGFloat width = image.size.width;
    CGFloat height = image.size.height;
    
    for(int i = 0; i < [pixelData length]; i += 4) {
        CGFloat _value = bitmap[i] + value;
        if (_value > 255) _value = 255;
        bitmap[i] = _value;
        bitmap[i+1] = bitmap[i+1];
        bitmap[i+2] = bitmap[i+2];
        bitmap[i+3] = bitmap[i+3];
    }
    CGDataProviderRef dataProviderRef = CGDataProviderCreateWithData(NULL, bitmap, width*height*4, NULL);
    CGImageRef result = CGImageCreate(image.size.width, image.size.height, 8, 32, width*4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaLast, dataProviderRef, NULL, 0, kCGRenderingIntentDefault);
    UIImage *newImage = [[UIImage alloc] initWithCGImage:result];
    
    CGImageRelease(result);
    //CFRelease(dataProviderRef);
    
    return newImage;
}
UIImage から CFDataRef を作成し、bytes を取得するとビッチマップデータになります。 ※ARCを利用する場合は、CFDataRef と NSData のキャストでブリッジしてやる必要があり ビットマップのRGBAは、for文の通り「+4」ステップで取得し、ピクセル値を変更してやります。 後は、CGDataProviderCreateWithData() などでごにょごにょして UIImage を作成します。 またアルファチャンネルとマスクでカラー変更する方法が「Bezelボタンを作る[12]画像をグレースケールで表示する(その2) 」に記載されていました。

グレースケールサンプル

- (UIImage *)grayscale:(UIImage *)image {
    CGRect rect = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGContextRef alphaContext = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0,
                                                      colorSpace, kCGImageAlphaOnly);
    CGContextDrawImage(alphaContext, rect, [image CGImage]);
    CGImageRef alphaImage = CGBitmapContextCreateImage(alphaContext);
    CGContextRelease(alphaContext);
    
    CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0,
                                                 colorSpace, kCGImageAlphaNone);
    CGContextDrawImage(context, rect, [image CGImage]);
    CGImageRef grayScaleImage = CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    
    UIImage* grayScaleUIImage = [UIImage imageWithCGImage:
                                 CGImageCreateWithMask(grayScaleImage, alphaImage)];
    
    CGImageRelease(grayScaleImage);
    CGImageRelease(alphaImage);
    CGColorSpaceRelease(colorSpace);

    return grayScaleUIImage;
}
AWS CLI と jq でインスタンス一覧を整形して表示
React と Laravel7 のプロジェクトを作成する
Homebrewインストール-2020年版
3直線で囲まれた範囲塗りつぶし
PuLP で線形最適化問題を解く
カスタムのペジネーションを作る
node-sass を使って sass をコンパイルする
Log ファサードでSQLログを分離して書き出す
いちから始める Docker - 複数のコンテナを使う - (2020年)
いちから始める Docker - docker-compose を使う - (2020年)
AWS ECR を使ってみる
Laravel7 でマルチ認証
Mac に AWS Client を設定する
Laravel 7 リリース
v-html でHTML表示する
Laravel で Vue コンポーネントを使う
Laravel で Nuxt.js を使ってみる(Docker環境)
いちから始める Docker -コンテナをビルド- (2020年)
いちから始める Docker -起動してみる- (2020年)
Mac で MySQL(8系)
composer で vendor がインストールできない
Eloquent の日付を Carbon で扱う
webpack 4 入門(npm編)
[Mac]容量を減らす
DIコンテナはじめ
freee SDKを Laravel で使ってみる
freee API を使ってみる
Segueを利用しない画面遷移
Xcode11.3 で XVim2 を利用する
Codable で JSONを読み込み
Webpack入門(yarn編)
MacからLaradock PostgreSQLで接続エラー
Dockerで不要なコンテナ・イメージを削除
Mac で Laradock の構築
yarn インストール&プロジェクト作成
Laravel 6.x 構築(Homestead編)
Composer インストール
nvm インストール
npm install が Mac でエラー
HTMLタグでカーソルが同時処理(ミラーリング)されてしまう
DI(依存性注入)
[Ubuntu]Let's Encryptで無料の証明書を利用する
[Apache]Apache2.4のアクセス制限が変更
[Ubuntu]rootのログインとsudo権限追加
タミヤ マイコンロボット工作セットをMacに接続してみた
pgAdimn4 でブラウザで開けなくなる
Java8 を HomebrewとjEnvで構築
Android Studio環境構築 2019
ロケールの再構築
vagrant グループに Apacheを追加