Search code examples
flutterimagedartbackgroundimagebackground

How to remove image background programmatically in flutter?


I need to remove the image background to white when I pick an image from the image picker, but I don't want to use API for that work. I can use a third-party plugin.


Solution

  • If you want custom background color you need to change the line

     Img.Image transparentImage = await colorTransparent(image, 255, 255, 255);
    

    Now it's 255, 255, 255, so it's moving white color now.

    Future<Uint8List> _downloadImage() async {
        String dir = (await getApplicationDocumentsDirectory()).path;
        File file = new File('$dir/$_filename');
    
        if (file.existsSync()) {
          var image = await file.readAsBytes();
          return image;
        } else {
          var response = await http.get(_url,);
          var bytes = response.bodyBytes;
          Uint8List newPng = await removeWhiteBackground(bytes);
          file.writeAsBytes(newPng);
          return newPng;
        }
      }
    
      Future<Uint8List> removeWhiteBackground(Uint8List bytes) async {
        Img.Image image = Img.decodeImage(bytes);
        Img.Image transparentImage = await colorTransparent(image, 255, 255, 255);
        var newPng = Img.encodePng(transparentImage);
        return newPng;
      }
    
    Future<Img.Image> colorTransparent(Img.Image src, int red, int green, int blue) async {
      var pixels = src.getBytes();
      for (int i = 0, len = pixels.length; i < len; i += 4) {
        if(pixels[i] == red
            && pixels[i+1] == green
            && pixels[i+2] == blue
        ) {
          pixels[i + 3] = 0;
        }
      }
    
      return src;
    }