如何在 Flutter 中制作带背景的抠图图标?

Posted

技术标签:

【中文标题】如何在 Flutter 中制作带背景的抠图图标?【英文标题】:How to make cutout icon with background in Flutter? 【发布时间】:2020-01-22 23:41:33 【问题描述】:

我想在 Flutter 中通过内置 Flutter 小部件实现以下效果,而不使用具有透明度的 PNG 图像。

我尝试使用 backgroundBlendingMode 但没有成功。

我也可以考虑使用自定义画家来绘制圆形和内十字,但理想情况下我想使用任何图标或任何其他小部件来切割背景。

我还偶然发现了一个名为 CustomClipper 的东西。这是要走的路吗?

假设我们有以下小部件:

  return Stack(
    children: <Widget>[
      SizedBox(
        height: 44,
        width: 44,
        child: Image.network(
          'https://images.pexels.com/photos/1295138/pexels-photo-1295138.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260',
          fit: BoxFit.cover,
        ),
      ),
      Positioned(
        left: 0,
        right: 0,
        bottom: 0,
        top: 0,
        child: Icon(
          Icons.close,
          color: Colors.black,
        ),
      ),
    ],
  );

可以拍摄样张图片from pexels。

【问题讨论】:

【参考方案1】:

好的,所以我在this question 中找到了关于 SO 的答案。

看来正确的关键字是cutout

所以我的解决方案非常简单,如下所示:

ClipRRect(
    borderRadius: BorderRadius.circular(12),
    child: Cutout(
        color: Colors.white,
        child: Icon(
        Icons.close,
        color: Colors.white,
        ),
    ),
),

还有使用ShaderMask的剪裁器:

class Cutout extends StatelessWidget 
  const Cutout(
    Key key,
    @required this.color,
    @required this.child,
  ) : super(key: key);

  final Color color;
  final Widget child;

  @override
  Widget build(BuildContext context) 
    return ShaderMask(
      blendMode: BlendMode.srcOut,
      shaderCallback: (bounds) =>
          LinearGradient(colors: [color], stops: [0.0]).createShader(bounds),
      child: child,
    );
  

【讨论】:

我将如何做到这一点以使其更矩形,中间有切口

以上是关于如何在 Flutter 中制作带背景的抠图图标?的主要内容,如果未能解决你的问题,请参考以下文章

光影魔术手抠图换背景图文教程

ps人物像发丝的抠图处理

头像/证件照抠图与圣诞背景替换

ps如何抠图变成透明背景

怎样把照片背景换成蓝色

常见的几种抠图方式?