今度、Flutterの書籍を発売することになりました。いや、執筆することの大変さは噂で聞いていたけど、本当に辛かったです。その辺りの話は別に書くとして、ここでは、書籍に載せるには「需要が少なそう/カラーじゃないと意味がない」と思って書籍から外したBlendModeについて書きます。このBlendModeですが、公式ドキュメントにも詳しく書いてあるのですが、もっとシンプルにした方が伝わると思い書きました。
頑張って書いたので、宣伝しちゃいます。こちらです。12/25に発売予定です。
少しでも誰かの役に立つと嬉しいと思います。
では本題です。
概要
BlendModeは色と色の合成モードです。BlendModeの名前付けは、一部Porter-Duffの論文に対応しています。Porter-Duffに関しては、ネット検索すれば出てきますが、別に知らなくて良いです。
BlendModeはenumで、Flutterの様々なところで利用されるのですが、ImageウィジェットのcolorBlendModeプロパティで説明するとわかりやすいです。
この場合は、色と画像の合成です。
Image.asset(
'images/flutter.png',
color: Colors.green.withOpacity(0.5),
colorBlendMode: BlendMode.srcOver,
),
BlendMode.clear
これを指定すると画像もcolorも表示されません
BlendMode.src
colorだけが表示されます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F7c4475d2-b52f-a5ee-59ac-7eb1e40ee783.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=aeabbf1389e0909e7508f89a3585ea64)
BlendMode.dst
画像だけが表示されます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F1207f241-dcdb-e885-94ad-aa97adc28d9e.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=94fe5957224f392951641990e8809b13)
BlendMode.srcOver
colorを上に画像を下にして合成します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2Fdc7c52ed-3fb2-8a88-7b16-177bee9bac00.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e575b39910a63925aa01112993d0b5e5)
BlendMode.dstOver
画像を上にcolorを下に合成します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F924533ab-2de1-4f8a-09f0-9de00663d09d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=59fbe76452bdb8b99958877204f57da0)
BlendMode.srcIn
colorと画像の重なっている部分だけ表示します。colorだけを表示します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F38e51f55-3060-4316-1bb8-c9c3e64c1f2e.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2c9fb5d956583aa7a1a930e276dd417e)
BlendMode.dstIn
colorと画像の重なっている部分だけ表示します。画像だけを表示します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F6f53938c-39fa-887d-ae38-a7d20a008a5c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5162df52db9b7b1d3b266f4089a135fb)
BlendMode.srcOut
colorと画像の重なっていない部分だけ表示します。colorだけを表示します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2Fb0509db5-9c22-715f-b399-fc80ec88c0e2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b8e5a3db855efc845cf912fffe918615)
BlendMode.dstOut
colorと画像の重なっていない部分だけ表示します。画像だけを表示します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F6067423e-9c2a-ab5e-081a-025f9bddbc97.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2a9f484bccf3e0477fc22d18de4dce1f)
BlendMode.srcATop
colorと画像の重なっている部分だけ表示します。colorを上に画像を下に合成します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2Faccb1ad5-bf18-ed66-c4c3-c389aa6f0395.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=1bde406ec013cd2dcc0f7c9e7a8f2788)
BlendMode.dstATop
colorと画像の重なっている部分だけ表示します。画像を上にcolorを下に合成します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F7ff9812a-9d01-1d6e-7141-b35ad85cbe3d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=3c1783e4ac047d76fdf4ca612358c040)
BlendMode.xor
画像の色とcolorをxor演算します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F31102423-32ac-a7db-d572-4a7f9344e1a5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d5ae654a0df835c6754f45dc98f202ad)
BlendMode.plus
画像の色とcolorをplus演算します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2Ff740f72f-7a32-4e9c-018c-e3bd06568ec5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a898660a64789e37d29f34bd447984aa)
BlendMode.modulate
画像とcolorの色成分を掛け合わせます。これは同じ色か暗い色にしかなりません。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F01394f7c-5b3b-6c2d-3e53-6c7e3e81b373.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=54369fde8d16381b2344416a0071b9bd)
BlendMode.screen
画像の色とcolorを反転させて、色成分を掛け合わせ、結果を反転させます。これは同じ色か明るい色にしかなりません。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2Faab8156a-1a7e-15a0-d296-9c7167f04d90.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5ad0072bcff8e0e55394786092cce8ce)
BlendMode.overlay
画像の色の値が小さい場合はこれをcolorの値と乗算し、colorの値が小さい場合はcolorの値の反転と画像の色の値を反転させを乗算してから結果を反転します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2Ffce681f9-427d-d15e-78db-54baa99902f3.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c54db4d3e8b601b119e5046b36ef3739)
BlendMode.darken
各カラーチャンネルから最小値を選択して合成します。 colorを上に画像を下にして合成します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2Fba3f69b3-7efd-149a-6a1c-0f5e7ad46e5a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=13ca1d830493073ad9a365cf206ce8ae)
BlendMode.lighten
各カラーチャンネルから最大値を選択して合成します。 colorを上に画像を下にして合成します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F92f3af3c-6d7c-1e9b-8954-c687354e88dc.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=7b86ea97ad7ff98a52fadcb6647d39a0)
BlendMode.colorDodge
画像の色を反転させたcolorで除算します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2Fdc0b7abe-080a-3179-b60b-404ee07b5753.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=1bb4d3c992efc4307f87c7ee14e6227c)
- BlendMode.colorBurn
画像の色を反転させ、colorで除算し、結果を反転させます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F0fa9bc37-3fd6-aed9-9a90-5e0f2782a126.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c6bd71782466e79f12e3f3dd4e8c1ab6)
BlendMode.hardLight
colorの値が小さい場合は、これを画像の色の値と乗算します。画像の色の値が小さい場合は、画像の色の値を反転させ、colorの値を反転させて、それらを乗算して、結果を反転します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F900a191c-2642-e67d-5ee2-10e44f15d197.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=6d2ac99e20db18837054e3fc52192b30)
BlendMode.softLight
colorが0.5より小さい場合はcolorDodgeを、大きい場合は、はcolorBurnを使用します。 これは、overlayと似ていますが柔らかい効果をもたらします。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F76c22142-cab7-5030-46df-a6a1f2c3a342.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=64c82fa27bcab71535a1bc8386c160ad)
BlendMode.difference
各チャンネルの大きい方の値から小さい方の値を引きます。 黒を合成しても効果はありません。白を合成すると、もう一方の画像の色が反転します。colorを上に画像を下にして合成します。 効果は、exclusionに近いが濃い色になります。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2Fa29ede66-c8a0-121d-9a0e-571ba35d9947.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=be02882067fbe1f881877e0e23ab6d8e)
BlendMode.exclusion
2つの画像の合計から2つの画像の積を2倍して引きます。 黒を合成しても効果はありません。白を合成すると、もう一方の画像の色が反転します。colorを上に画像を下にして合成します。 効果は、differenceに近いが柔らかい色になります。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2Fd69db85f-03b9-9b18-3819-72e32535a0bb.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=66541ec063edaa99220b6918bb93a7c5)
BlendMode.multiply
アルファチャンネルを含む、画像の色とcolorを乗算します。これは、同じ色またはより暗い色にしかなりません。アルファチャンネルも乗算されるので、透明なピクセルがあると結果も透明なピクセルになります。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2Fddf2ea95-dd92-b6f2-b29e-1693e50de5b1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a4941ff9ae70b619c1629d73acdbb52e)
BlendMode.hue
色相をcolor、彩度と明度を画像の色からとります。colorを上に画像を下にして合成します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F4f727629-e057-7deb-15b2-929087b197c6.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=21380c98eaf6de14c762479668381e6d)
BlendMode.saturation
彩度をcolor、色相と明度を画像の色からとります。colorを上に画像を下にして合成します。color内で完全に透明な領域は、画像の色から彩度をとります。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F5ba3d569-11e0-7115-96b5-c407e6e346b2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=7a9e35d574c472541cf09fa41d41c337)
BlendMode.color
色相と彩度をcolor、明度を画像の色からとります。colorを上に画像を下にして合成します。color内で完全に透明な領域は、画像の色から色相と彩度をとります。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F6e7756cc-784e-095b-2289-c9772351c5c7.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ab897198f75689c2a2c5cd10053d5e2d)
BlendMode.luminosity
明度をcolor、色相と彩度は画像の色からとります。colorを上に画像を下にして合成します。color内で完全に透明な領域は、画像の色から明度をとります。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F10494%2F250292f6-75c3-83de-e5de-0f06a3079fd7.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=047c5fd7f264a58516e9ce10c329bd8a)