画像の指定色の範囲を切り抜けなくなった? @iOS12

公開日:2019-02-06
最終更新:2019-02-06

概要

CGImageCreateWithMaskingColors() メソッドがうまく動かなくなった、という話

やっていたこと

CGImageRef myColorMaskedImage;  
UIColor* fillColor;  
const CGFloat myMaskingColors[6] = {0, 128,  0, 128, 0, 128};  
myColorMaskedImage = CGImageCreateWithMaskingColors (image, myMaskingColors);
  • 元画像は暗めのグレーの背景の上に、白い四角形の乗っている画像
    • グレーの背景を除去し、その部分を透過にしていた



      左が元画像、右が背景色除去後の画像 (黒い部分は透過。以下同様)

発生した問題

CGImageCreateWithMaskingColors(image, component)
iOS11ではうまく動いていたが、iOS12では動かなくなっていた
(元画像のまま、変わらなくなっていた)
なぜか各色のMaxの値が255になっていないと除去できない
→暗い色や中間色だけを除去することができない

→白い部分を除去→

↑これはできるけど

→グレーの部分を除去→

↑これができない

原因

iOS10では透過部分を含むマスク画像を生成するために、
予め元画像を不透明画像に変換し、背景色を除去する際にはその画像を使用していた

UIGraphicsBeginImageContextWithOptions(image, YES, [UIScreen mainScreen].scale);  
[image drawAtPoint:CGPointZero];  
opaqueImage = UIGraphicsGetImageFromCurrentImageContext();  
UIGraphicsEndImageContext();  

CGImageRef myColorMaskedImage;  
UIColor* fillColor;  
const CGFloat myMaskingColors[6] = {0, 128,  0, 128, 0, 128};  
myColorMaskedImage = CGImageCreateWithMaskingColors (opaqueImage, myMaskingColors);

が、iOS12でこれを行うと、逆に透過部分を含むマスク画像が生成できなくなるようだった

対策

原因となった上記の処理を、iOS12以降は行わないようにした

*ちなみに、iOS11は上記の処理があってもなくても正しく動作する

応急処置

上記の対策で直ったかと思ったが、iOS12のiPadでは直っていなかった
結局原因は分からず、以下の応急処置を行った

  1. 画像の白い部分を除去する



  2. 1.の画像と元画像を、kCGBlendModeXORモードでブレンドする
    →白い部分は除去できるので、そこを除去してから、除去する範囲を反転させた

    XOR

終わりに

検索しても全然情報がないので、この問題はもしかしたら
私自身がどこかで何かを間違えているせいかも・・・?

記事が少しでもいいなと思ったらクラップを送ってみよう!
0
+1
@marshmallow444の技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする