How to remove image background programmatically in flutter?

1.7k views Asked by At

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.

1

There are 1 answers

3
Anandh Krishnan On BEST ANSWER

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;
}