Crop any widget/image in Android, iOS, Web and Desktop with fancy and customizable UI, in pure Dart code.

Overview

crop

pub package

A Flutter package for cropping any widget, not only images. This package is entirely written in Dart and supports Android, iOS, Web and Desktop. Also, because of being independent from native platform, it does not increase size of your apps output (e.g. apk).

Supported platforms

  • Flutter Android
  • Flutter iOS
  • Flutter Web (as of 2020 Nov 24)*
  • Flutter Desktop

* In order to run Crop on web correctly, flutter version 1.24.0-8.0.pre.359 or above is needed (master channel) and you need to enable CanvasKit/Skia when compiling: flutter build web --dart-define=FLUTTER_WEB_USE_SKIA=true

Web Demo | Install from Google Play

Screenshot

Getting Started

In your pubspec.yaml file add:

dependencies:
  crop: any

Then, in your code import:

import 'package:crop/crop.dart';

Now in build function, put a Crop widget in the widget tree and you are done. Please don't forget to check /example folder, there is much more.

Comments
  • Cropping and zooming doesn't work on Web

    Cropping and zooming doesn't work on Web

    1. The image looks darkened then it has;
    2. Can't zoom image(trying with the mouse wheel);
    3. Got the error: "Unsupported operation: toImage is not supported on the Web" after pressing "Crop" button.

    Tested on: Chrome(Version 80.0.3987.163 (Official Build) (64-bit)), Mozilla Firefox(75.0 (64-bit)) deps:

    crop: ^0.3.1+1
    image_picker_web: ^1.0.6
    image_picker: ^0.6.5
    

    Source code:

    import 'package:flutter/material.dart';
    import 'package:image_picker_web/image_picker_web.dart';
    import './image.dart';
    import 'dart:io';
    import 'package:image_picker/image_picker.dart';
    import 'package:flutter/foundation.dart' show kIsWeb;
    import 'dart:ui';
    import './centered_slider_track_shape.dart';
    import 'package:flutter/material.dart';
    import 'package:crop/crop.dart';
    import 'package:firebase_storage/firebase_storage.dart';
    import 'package:path/path.dart' as Path;
    import 'package:path_provider/path_provider.dart';
    import 'dart:async';
    import 'dart:io';
    import 'dart:typed_data';
    import 'dart:math';
    
    
    class UserPage extends StatefulWidget {
      @override
      _UserPageState createState() => _UserPageState();
    }
    
    class _UserPageState extends State<UserPage> {
      Image pickedImage;
    
      @override
      void initState() {
        super.initState();
      }
    
      Future getImageMobile() async {
        var image = await ImagePicker.pickImage(source: ImageSource.gallery);
    
        setState(() {
          pickedImage = Image.file(
            image,
            fit: BoxFit.cover,
          );
        });
      }
    
      getImageWeb() async {
        Image fromPicker =
            await ImagePickerWeb.getImage(outputType: ImageType.widget);
        if (fromPicker != null) {
          setState(() {
            pickedImage = fromPicker;
          });
        }
      }
    
      pickImage() async {
        if (kIsWeb) {
          await getImageWeb();
        } else {
          await getImageMobile();
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Image Picker Web Example'),
            ),
            body: Center(
                child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    mainAxisSize: MainAxisSize.min,
                    children: <Widget>[
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    mainAxisSize: MainAxisSize.min,
                    children: <Widget>[
                      AnimatedSwitcher(
                        duration: Duration(milliseconds: 300),
                        switchInCurve: Curves.easeIn,
                        child: SizedBox(
                              width: 200,
                              child: pickedImage,
                            ) ??
                            Container(),
                      ),
                      SizedBox(
                        width: 15,
                      ),
                    ],
                  ),
                  ButtonBar(alignment: MainAxisAlignment.center, children: <Widget>[
                    RaisedButton(
                      onPressed: () => pickImage(),
                      child: Text('Select Image'),
                    ),
                    RaisedButton(
                      onPressed: () {
                        Navigator.of(context).push(
                          MaterialPageRoute<void>(
                              builder: (_) => ImagePage(
                                    image: pickedImage,
                                  )),
                        );
                      },
                      child: Text('Crop'),
                    ),
                  ]),
                ])),
          ),
        );
      }
    }
    
    class ImagePage extends StatefulWidget {
      ImagePage({Key key, @required this.image}) : super(key: key);
    
      final Image image;
      @override
      _ImagePageState createState() => _ImagePageState(image);
    }
    
    class _ImagePageState extends State<ImagePage> {
      _ImagePageState(this.image);
      final Image image;
      String _uploadedFileURL;
      final controller = CropController(aspectRatio: 1000 / 667.0);
      double _rotation = 0;
    
      @override
      void initState(){
        super.initState();
        controller.aspectRatio = 1;
        setState(() {
    
        });
      }
    
      void _cropImage() async {
        final pixelRatio = MediaQuery.of(context).devicePixelRatio;
        final cropped = await controller.crop(pixelRatio: pixelRatio);
    
        Navigator.of(context).push(
          MaterialPageRoute(
            builder: (context) => Scaffold(
              appBar: AppBar(
                title: Text('Crop Result'),
                centerTitle: true,
                actions: <Widget>[
                  IconButton(
                    icon: Icon(Icons.file_upload),
                    tooltip: 'Upload',
                    onPressed: () async {
                      // getting a directory path for saving
                      var dir = await getApplicationDocumentsDirectory();
                      final ByteData data = await cropped.toByteData(format: ImageByteFormat.png);
                      final buffer = data.buffer;
    
                      final String fileName = Random().nextInt(10000).toString() +'.png';
                      print(fileName);
    
                      final File newImage = await new File('${dir.path}/$fileName').writeAsBytes(
                          buffer.asUint8List(data.offsetInBytes, data.lengthInBytes));
                      await uploadFile(newImage);
                    },
                  ),
                ],
              ),
              body: Center(
                child: RawImage(
                  image: cropped,
                ),
              ),
            ),
            fullscreenDialog: true,
          ),
        );
      }
    
      Future uploadFile(File img) async {
      }
    
      @override
      Widget build(BuildContext context) {
        final theme = Theme.of(context);
        return Scaffold(
          appBar: AppBar(
            title: Text('Crop Demo'),
            centerTitle: true,
            actions: <Widget>[
              IconButton(
                onPressed: _cropImage,
                tooltip: 'Crop',
                icon: Icon(Icons.crop),
              )
            ],
          ),
          body: Column(
            children: <Widget>[
              Expanded(
                child: Container(
                  color: Colors.black,
                  padding: EdgeInsets.all(8),
                  child: Crop(
                    controller: controller,
                    child: image,
                    helper: Container(
                      decoration: BoxDecoration(
                        border: Border.all(color: Colors.white, width: 2),
                      ),
                    ),
                  ),
                ),
              ),
              Row(
                children: <Widget>[
                  IconButton(
                    icon: Icon(Icons.undo),
                    tooltip: 'Undo',
                    onPressed: () {
                      controller.rotation = 0;
                      controller.scale = 1;
                      controller.offset = Offset.zero;
                      setState(() {
                        _rotation = 0;
                      });
                    },
                  ),
                  Expanded(
                    child: SliderTheme(
                      data: theme.sliderTheme.copyWith(
                        trackShape: CenteredRectangularSliderTrackShape(),
                      ),
                      child: Slider(
                        divisions: 361,
                        value: _rotation,
                        min: -180,
                        max: 180,
                        label: '$_rotation°',
                        onChanged: (n) {
                          setState(() {
                            _rotation = n.roundToDouble();
                            controller.rotation = _rotation;
                          });
                        },
                      ),
                    ),
                  ),
                ],
              ),
            ],
          ),
        );
      }
    }
    
    opened by stalko 39
  • Image is cut

    Image is cut

    I've expected this plugin to work like the cropping function on e.g. instagram or other photo apps.

    Let me give you an example: The app expects a certain format for phots, let's say a ascpect ration of 16:9. Now the user selects a portrait photo from his gallery. The cropping tool now allow you to select a part of the image which has to fit in the 16:9 frame.

    When trying the crop demo I got another behavior: When starting the demo I can see the whole sample picture. When changing the aspect ration to 16:9 the top and bottom of the image is cut off. I'm not able to select the missing part of the picture anymore.

    Is that the intended behaviour or is it a bug? If it is not clear what I mean I can provide screenshots.

    opened by mscherer82 34
  • Unsupported operation: LayerScene.toImage not implemented

    Unsupported operation: LayerScene.toImage not implemented

    I implemented the crop widget to an existing application and now it is throwing an error below, at this line:

    return rrb.toImage(pixelRatio: pixelRatio);

    Maybe I am importing a wrong library somewhere. Do you have any idea? The error occurs when I click the crop button.

    Uncaught (in promise) Error: Unsupported operation: LayerScene.toImage not implemented.
        at Object.throw_ [as throw] (errors.dart:216)
        at _engine.LayerScene.new.toImage (layer_scene_builder.dart:20)
        at layer$.OffsetLayer.new.toImage (layer.dart:1206)
        at toImage.next (<anonymous>)
        at runBody (async_patch.dart:84)
        at Object._async [as async] (async_patch.dart:123)
        at layer$.OffsetLayer.new.toImage (layer.dart:1190)
        at proxy_box.RenderRepaintBoundary.new.toImage (proxy_box.dart:2968)
        at ui$._CropState.new.[_crop] (ui.dart:80)
        at ui$.CropController.new.crop (ui.dart:409)
        at crop_widget._CropWidgetState.new.<anonymous> (crop_widget.dart:47)
        at Generator.next (<anonymous>)
        at runBody (async_patch.dart:84)
        at Object._async [as async] (async_patch.dart:123)
        at crop_widget.dart:44
        at ink_well._InkResponseState.new.[_handleTap] (ink_well.dart:985)
        at ink_well.dart:1101
        at tap.TapGestureRecognizer.new.invokeCallback (recognizer.dart:183)
        at tap.TapGestureRecognizer.new.handleTapUp (tap.dart:598)
        at tap.TapGestureRecognizer.new.[_checkUp] (tap.dart:287)
        at tap.TapGestureRecognizer.new.acceptGesture (tap.dart:259)
        at arena.GestureArenaManager.new.sweep (arena.dart:157)
        at binding$5.WidgetsFlutterBinding.new.handleEvent (binding.dart:372)
        at binding$5.WidgetsFlutterBinding.new.dispatchEvent (binding.dart:348)
        at binding$5.WidgetsFlutterBinding.new.dispatchEvent (binding.dart:268)
        at binding$5.WidgetsFlutterBinding.new.[_handlePointerEventImmediately] (binding.dart:303)
        at binding$5.WidgetsFlutterBinding.new.handlePointerEvent (binding.dart:267)
        at binding$5.WidgetsFlutterBinding.new.[_flushPointerEventQueue] (binding.dart:225)
        at binding$5.WidgetsFlutterBinding.new.[_handlePointerDataPacket] (binding.dart:208)
        at Object._invoke1 (window.dart:853)
        at _engine.EngineWindow.new.invokeOnPointerDataPacket (window.dart:389)
        at _engine.PointerBinding.__.[_onPointerData] (pointer_binding.dart:129)
        at pointer_binding.dart:479
        at pointer_binding.dart:440
        at pointer_binding.dart:210
    
    opened by pulstar 22
  • Support

    Support "fit to min" in addition to "fit to max".

    This widget is awesome! We would like a configuration option to limit scaling to fit the min dimension. The current behavior limits scaling to the max dimension.

    When cropping circular (square) avatars from rectangular source images, we would like to limit the scaling fit to the min dimension such that no parts of the resulting image are blank. The current behavior limits the scaling fit to the max dimension which can result in blank areas on the min dimension sides.

    For example a rectangular vertical (portrait) image cropped to a square aspect ratio has blank area on left and right sides (i.e. min dimension). The requested option would not allow the image to be scaled smaller than what fits across the min (e.g. horizontal) dimension. Currently the scaling is limited to the max dimension (in this example the vertical dimension) which can result in blank areas on the left and/or right sides.

    opened by rich-j 18
  • [web/mobile] Unsupported operation: toImage is not supported on the Web

    [web/mobile] Unsupported operation: toImage is not supported on the Web

    Only on web mobile (chrome and safari) am I getting "Unsupported operation: toImage is not supported on the Web", when I try to crop.

    This works fine on chrome for my pc, which is interesting.

    Any chance on how soon this can be fixed? Love your package so far works great besides this.

    opened by ctapp1 14
  • Dimm color cover all widget (not only the outer part of the image) [web - 1.24.0-10.2.pre]

    Dimm color cover all widget (not only the outer part of the image) [web - 1.24.0-10.2.pre]

    The entire image to be cropped is dimmed. I thought it was a problem with my code, but I downloaded your sample project and ran it in Chrome, and the same thing happened. My Flutter version is 1.24.0-10.2.pre Beta

    crop error
    opened by JoaquinNievas 14
  • Crop issues under Flutter web (Android is fine)

    Crop issues under Flutter web (Android is fine)

    1. How do I zoom in/out in Flutter web?

    2. Why do the crop window always return to the image's center after I try to pan it?

    3. I compiled the crop demo, but the image inside the crop window is very dark (see below). The online demo is working fine.

    image

    1. The oval shape does not show in Flutter web.
    opened by pulstar 13
  • Total width and height

    Total width and height

    Hi. Can I set the total output width and height of my Image? I would like to get Image (example) in 800x800 size independent from the image inside. Too if the image inside is smaller than 800x800.

    opened by michaldev 11
  •  w/

    w/ "--web-renderer=html" Crop fails: `Unsupported operation: toImage is not supported on the Web`

    I am using --dart-define=FLUTTER_WEB_USE_SKIA=true, on the Master channel and Crop works fine. But due to another requirement, I have to add the flag --web-renderer=html. With that additional flag, Crop fails.

    Would you have any idea of a work around?

    Here's my launch.json configuration

      {
          "name": "Chrome SKIA Dev",
          "request": "launch",
          "type": "dart",
          "program": "lib/main_web_dev.dart",
          "args": [
            "-d",
            "chrome",
            "--dart-define=FLUTTER_WEB_USE_SKIA=true",
            "--web-renderer=html"
          ]
        },
    

    Here's the stack

    Error: Unsupported operation: toImage is not supported on the Web
        at Object.throw_ [as throw] (http://localhost:65382/dart_sdk.js:4351:11)
        at _engine.SurfaceScene.new.toImage (http://localhost:65382/dart_sdk.js:158747:17)
        at layer$.OffsetLayer.new.toImage (http://localhost:65382/packages/flutter/src/rendering/layer.dart.lib.js:1636:30)
        at toImage.next (<anonymous>)
        at runBody (http://localhost:65382/dart_sdk.js:37988:34)
        at Object._async [as async] (http://localhost:65382/dart_sdk.js:38019:7)
        at layer$.OffsetLayer.new.toImage (http://localhost:65382/packages/flutter/src/rendering/layer.dart.lib.js:1627:20)
        at proxy_box.RenderRepaintBoundary.new.toImage (http://localhost:65382/packages/flutter/src/rendering/proxy_box.dart.lib.js:3355:26)
        at ui$._CropState.new.[_crop] (http://localhost:65382/packages/crop/src/ui.dart.lib.js:715:18)
        at ui$.CropController.new.crop (http://localhost:65382/packages/crop/src/ui.dart.lib.js:977:33)
        at crop_widget._CropWidgetPageState.new._cropImage (http://localhost:65382/packages/MyFamilyVoice/web/crop_widget.dart.lib.js:1712:46)
        at _cropImage.next (<anonymous>)
        at runBody (http://localhost:65382/dart_sdk.js:37988:34)
        at Object._async [as async] (http://localhost:65382/dart_sdk.js:38019:7)
        at crop_widget._CropWidgetPageState.new.[_cropImage] (http://localhost:65382/packages/MyFamilyVoice/web/crop_widget.dart.lib.js:1709:20)
        at ink_well._InkResponseState.new.[_handleTap] (http://localhost:65382/packages/flutter/src/material/icon_button.dart.lib.js:51085:42)
        at tap.TapGestureRecognizer.new.invokeCallback (http://localhost:65382/packages/flutter/src/gestures/recognizer.dart.lib.js:189:18)
        at tap.TapGestureRecognizer.new.handleTapUp (http://localhost:65382/packages/flutter/src/gestures/tap.dart.lib.js:395:40)
        at tap.TapGestureRecognizer.new.[_checkUp] (http://localhost:65382/packages/flutter/src/gestures/tap.dart.lib.js:201:12)
        at tap.TapGestureRecognizer.new.acceptGesture (http://localhost:65382/packages/flutter/src/gestures/tap.dart.lib.js:178:23)
        at arena.GestureArenaManager.new.sweep (http://localhost:65382/packages/flutter/src/gestures/arena.dart.lib.js:208:31)
        at binding$5.WidgetsFlutterBinding.new.handleEvent (http://localhost:65382/packages/flutter/src/gestures/binding.dart.lib.js:318:27)
        at binding$5.WidgetsFlutterBinding.new.dispatchEvent (http://localhost:65382/packages/flutter/src/gestures/binding.dart.lib.js:297:24)
        at binding$5.WidgetsFlutterBinding.new.dispatchEvent (http://localhost:65382/packages/flutter/src/rendering/layer.dart.lib.js:6093:13)
        at binding$5.WidgetsFlutterBinding.new.[_handlePointerEventImmediately] (http://localhost:65382/packages/flutter/src/gestures/binding.dart.lib.js:268:14)
        at binding$5.WidgetsFlutterBinding.new.handlePointerEvent (http://localhost:65382/packages/flutter/src/gestures/binding.dart.lib.js:241:43)
        at binding$5.WidgetsFlutterBinding.new.[_flushPointerEventQueue] (http://localhost:65382/packages/flutter/src/gestures/binding.dart.lib.js:230:14)
        at binding$5.WidgetsFlutterBinding.new.[_handlePointerDataPacket] (http://localhost:65382/packages/flutter/src/gestures/binding.dart.lib.js:220:65)
        at Object.invoke1 (http://localhost:65382/dart_sdk.js:178716:7)
        at _engine.EnginePlatformDispatcher.__.invokeOnPointerDataPacket (http://localhost:65382/dart_sdk.js:161367:15)
        at _engine.PointerBinding.__.[_onPointerData] (http://localhost:65382/dart_sdk.js:162002:49)
        at http://localhost:65382/dart_sdk.js:162435:26
        at http://localhost:65382/dart_sdk.js:162394:16
        at http://localhost:65382/dart_sdk.js:162102:11
    Application finished.
    
    

    Here's doctor:

    flutter doctor -v
    [✓] Flutter (Channel master, 1.25.0-5.0.pre.57, on macOS 11.0.1 20B29 darwin-x64, locale en-US)
        • Flutter version 1.25.0-5.0.pre.57 at /Users/bartonhammond/tools/flutter
        • Framework revision b358854172 (18 hours ago), 2020-12-03 22:41:37 +0100
        • Engine revision 20caf54969
        • Dart version 2.12.0 (build 2.12.0-76.0.dev)
    
    [✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
        • Android SDK at /Users/bartonhammond/Library/Android/sdk
        • Platform android-29, build-tools 29.0.2
        • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
        • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6915495)
        • All Android licenses accepted.
    
    [✓] Xcode - develop for iOS and macOS (Xcode 12.1)
        • Xcode at /Applications/Xcode.app/Contents/Developer
        • Xcode 12.1, Build version 12A7403
        • CocoaPods version 1.9.3
    
    [✓] Chrome - develop for the web
        • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
    
    [✓] Android Studio (version 4.1)
        • Android Studio at /Applications/Android Studio.app/Contents
        • Flutter plugin can be installed from:
          🔨 https://plugins.jetbrains.com/plugin/9212-flutter
        • Dart plugin can be installed from:
          🔨 https://plugins.jetbrains.com/plugin/6351-dart
        • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6915495)
    
    [✓] VS Code (version 1.51.1)
        • VS Code at /Applications/Visual Studio Code.app/Contents
        • Flutter extension version 3.16.0
    
    [✓] Connected device (2 available)
        • iPhone SE (2nd generation) (mobile) • 5D61B4C3-F813-4E6D-BD30-D9A81F0C867C • ios            • com.apple.CoreSimulator.SimRuntime.iOS-14-1 (simulator)
        • Chrome (web)                        • chrome                               • web-javascript • Google Chrome 87.0.4280.88
    
    • No issues found!
    
    opened by bartonhammond 10
  • Please add some more documentation

    Please add some more documentation

    Hi,

    your Cropping widget looks awesome and exactly what I need. Unfortunately I'm absolutely not clear on how I really have to use it.

    • What is the helper good for?
    • How is the intended workflow with this widget?
    • Do I have to handle gestures myself and use the controller accordingly to zoom / pan?
    • If I want to cut a smaller area from my image, do I have to zoom in and pan so that the area that I want fills the whole Crop widget?

    I really would be greateful for some pointers.

    opened by escamoteur 8
  • Add support for rotation using two finger gesture

    Add support for rotation using two finger gesture

    Will close the old PR https://github.com/xclud/flutter_crop/pull/30

    The image to crop can now be rotated with two fingers gesture as well. rotate_gesture

    Currently, haven't updated the example to also sync the slider with the rotation, as it is dependent on the other PR https://github.com/xclud/flutter_crop/pull/31, Once both the changes are available, we can do like the following example:

    void initState(){
        super.initState();
    
        controller.onChanged = (details){
          print("Scale : ${details.scale}, Rotation: ${details.rotation}, translation: ${details.translation}");
          setState(() => _rotation = details.rotation.roundToDouble());
        };
      }
    

    Note that, the min & max value of the slider will need to be in the range (-360, 360) since the rotation values can be in this range:

    Slider(
        divisions: 361,
        value: _rotation,
        min: -360,
        max: 360,
        label: '$_rotation°',
        /* Other args */
    )
    
    opened by sanjul 8
  • Cropping in Web Flutter 3.3.9 still black image

    Cropping in Web Flutter 3.3.9 still black image

    Hi! First of all, thank you so much for spending your time making this package, is amazing!

    I still have the same issue that other people has reported: https://github.com/xclud/flutter_crop/issues/78 or https://github.com/xclud/flutter_crop/issues/79 using Flutter 3.3.9.

    Anyone has fixed this issue? Thanks!

    opened by alfredo-handcash 2
  • Pre-Cropping

    Pre-Cropping

    We are using your widget to create square avatars. When we do so, it pre-crops the original image.

    Here is an image.

    Given this original image, we placed it inside your example app, changing only line 106 to reference this image (also adding it as an asset in the pubspec.yaml).

    When we run the app and set a 1:1 aspect ratio, which is the functionality we want, here's what we end up with. We can't see the person of interest because of the pre-crop that occurs due to the fit: BoxFit.cover.

    Below is the desired result.

    bug 
    opened by K-Y-Johnson 27
Owner
Mahdi
Freelance developer.
Mahdi
Build a fancy looking avatar widget with a colorfull ring around the image

Build a fancy looking avatar widget with a colorfull ring around the image

Paweł Wacławiak 0 Feb 19, 2022
A simple and easy flutter demo to crop image

flutter_image_crop A simple demo to crop image on flutter easily. A Chinese version of this document can be found here Flutter_image_crop Plugin will

路小飞 3 Jul 8, 2021
An image editor with crop, scribble, mosaic, add-text, flip, rotated functions.

image_editor_dove A high-performance image editor with crop, scribble, mosaic, add-text, flip, rotated functions. Support custom ui style. drawing rot

null 27 Dec 16, 2022
📸 Easy to use yet very customizable zoomable image widget for Flutter, Photo View provides a gesture sensitive zoomable widget. Photo View is largely used to show interacive images and other stuff such as SVG.

Flutter Photo View A simple zoomable image/content widget for Flutter. PhotoView enables images to become able to zoom and pan with user gestures such

Fire Slime Games 1.7k Jan 3, 2023
Simple and effective cross platform image saver for flutter, supported web and desktop

Simple and effective cross platform image saver for flutter, supported web and desktop

7c00 3 Oct 5, 2022
A flutter plugin which provides Crop Widget for cropping images.

A flutter plugin which provides Crop Widget for cropping images. crop_your_image provides only minimum UI for deciding cropping area inside images. Other UI parts, such as "Crop" button or "Change Aspect Ratio" button, need to be prepared by each app developers.

Chooyan 96 Dec 31, 2022
A flutter package to convert any widget to an Image.

Davinci A package to convert any widget to an image which can be saved locally or can be shared to other apps and chats. ?? Preview ℹ️ Usage Prerequis

Sai Gokula Krishnan 37 Dec 20, 2022
Flutter package for Image Carousel It is an image carousel widget.

Snapshot Carousel Flutter package for Image Carousel It is an image carousel widget. Supported platforms Flutter Android Flutter iOS Flutter web Flutt

Mrigank Anand 12 Jun 3, 2021
Loading indicator GIFs. Material and Cupertino (Android and iOS) loading indicators in assorted sizes. Use as placeholders for loading remote image assets. Demo: https://gallery.codelessly.com/flutterwebsites/loadinggifs/

Loading GIFs High quality Android and iOS loading spinners. View Demo Loading GIFs is a collection of high fidelity loading animations in GIF format.

Codelessly 31 Dec 23, 2022
Flutter plugin that allows you to display multi image picker on iOS and Android. 👌🔝🎉

IMPORTANT: This repository has been archived and no longer mantained. As I don't have time anymore to work on the package it became very outdated. For

Radoslav Vitanov 898 Apr 29, 2021
A flutter tool to generate beautiful code snippets in the form of an image.

A flutter tool to generate beautiful code snippets in the form of an image.

Mahesh Jamdade 4 Jan 18, 2022
A Flutter widget that paints an image and moves it at a slower speed than the main scrolling content.

A Flutter widget that paints an image and moves it at a slower speed than the main scrolling content. Installation Add dependency to your pubspec.yaml

Anatoly Pulyaevskiy 272 Dec 23, 2022
A Flutter image editor with support for paint, text, filters, emojis, stickers and more

Flutter Image Editor Plugin with simple, easy support for image editing using Paints, Text, Filters, Emoji and Sticker like stories.

null 44 Dec 22, 2022
Image caching system for flutter

image_cacheing image_cacheing is an image caching package. It is currently tested for Android applications. ImageCacheing widget takes url as a param.

evolving_kid 3 May 31, 2021
A scrollable, dismissable by swiping, zoomable, rotatable image gallery on which you can add a dynamic overlay.

Swipe Image Gallery A scrollable, dismissable by swiping, zoomable, rotatable image gallery on which you can add a dynamic overlay. While it is intend

null 20 Dec 7, 2022
A simple Flutter Package to Mimic iMessage Image Picker for Flutter

A simple Flutter Package to Mimic iMessage Image Picker for Flutter

Paras Jain 64 Dec 26, 2022
Flutter Image Upload From Gallery

Image Upload From Gallery Image upload from gallery to Backend Dependencies image_picker: ^0.8.4+1 http: ^0.13.3 dio: ^4.0.0 Getting Started Image upl

Fatih Baycu 2 Oct 6, 2021
Multi image pixker using the image_picker package in flutter

multi_image_selection A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you st

Ambaliya Avnit Karshanbhai 1 Oct 13, 2021
flutter image demo 主要展示图片与动画处理的案例。比如:网络图片加载、图片预览、图片缩放、json动画处理等等。

flutter_image_demo flutter image demo 主要展示图片与动画处理的案例。 比如:网络图片加载、图片预览、图片缩放、json动画处理等等。 本项目使用到以下插件: cached_network_image、 photo_view 、 lottie 、 flutter_

null 2 Feb 27, 2022