├── .gitignore ├── .metadata ├── CONTRIBUTING.md ├── LICENSE.txt ├── PRIVACY.MD ├── README.md ├── android ├── .gitignore ├── app │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── image_editor │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets └── images │ └── homescreen.jpg ├── demo ├── 1.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg ├── 5.jpg └── ImageMockup.png ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── editScreen.dart ├── main.dart └── saveScreen.dart ├── pubspec.lock └── pubspec.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .flutter-plugins-dependencies 28 | .packages 29 | .pub-cache/ 30 | .pub/ 31 | /build/ 32 | 33 | # Web related 34 | lib/generated_plugin_registrant.dart 35 | 36 | # Symbolication related 37 | app.*.symbols 38 | 39 | # Obfuscation related 40 | app.*.map.json 41 | 42 | # Exceptions to above rules. 43 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 44 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 1ad9baa8b99a2897c20f9e6e54d3b9b359ade314 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: 3 | 4 | - Reporting a bug 5 | - Discussing the current state of the code 6 | - Submitting a fix 7 | - Proposing new features 8 | - Becoming a maintainer 9 | 10 | ## We Develop with Github 11 | We use github to host code, to track issues and feature requests, as well as accept pull requests. 12 | 13 | ## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests 14 | Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests: 15 | 16 | 1. Fork the repo and create your branch from `master`. 17 | 2. If you've added code that should be tested, add tests. 18 | 3. If you've changed APIs, update the documentation. 19 | 4. Ensure the test suite passes. 20 | 5. Make sure your code lints. 21 | 6. Issue that pull request! 22 | 23 | ## Any contributions you make will be under the BSD-3 Software License 24 | In short, when you submit code changes, your submissions are understood to be under the same [BSD-3 License](https://choosealicense.com/licenses/bsd-3-clause/) that covers the project. Feel free to contact the maintainers if that's a concern. 25 | 26 | ## Report bugs using Github's [issues](https://github.com/codenameakshay/image-editor/issues) 27 | We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/codenameakshay/image-editor/issues/new); it's that easy! 28 | 29 | ## Write bug reports with detail, background, and sample code 30 | **Great Bug Reports** tend to have: 31 | 32 | - A quick summary and/or background 33 | - Steps to reproduce 34 | - Be specific! 35 | - Give sample code if you can. 36 | - What you expected would happen 37 | - What actually happens 38 | - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) 39 | 40 | People *love* thorough bug reports. We're not even kidding. 41 | 42 | ## Use a Consistent Coding Style 43 | * Use DART formatter 44 | 45 | ## License 46 | By contributing, you agree that your contributions will be licensed under its BSD-3 License. 47 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2020 Akshay Maurya 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /PRIVACY.MD: -------------------------------------------------------------------------------- 1 | **Privacy Policy** 2 | 3 | Akshay Maurya built the Image Editor app as an Open Source app. This SERVICE is provided by Akshay Maurya at no cost and is intended for use as is. 4 | 5 | This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service. 6 | 7 | If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy. 8 | 9 | The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Image Editor unless otherwise defined in this Privacy Policy. 10 | 11 | **Information Collection and Use** 12 | 13 | For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information. The information that I request will be retained on your device and is not collected by me in any way. 14 | 15 | The app does use third party services that may collect information used to identify you. 16 | 17 | Link to privacy policy of third party service providers used by the app 18 | 19 | * [Google Play Services](https://www.google.com/policies/privacy/) 20 | 21 | **Log Data** 22 | 23 | I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics. 24 | 25 | **Cookies** 26 | 27 | Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory. 28 | 29 | This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service. 30 | 31 | **Service Providers** 32 | 33 | I may employ third-party companies and individuals due to the following reasons: 34 | 35 | * To facilitate our Service; 36 | * To provide the Service on our behalf; 37 | * To perform Service-related services; or 38 | * To assist us in analyzing how our Service is used. 39 | 40 | I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose. 41 | 42 | **Security** 43 | 44 | I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security. 45 | 46 | **Links to Other Sites** 47 | 48 | This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services. 49 | 50 | **Children’s Privacy** 51 | 52 | These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13\. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do necessary actions. 53 | 54 | **Changes to This Privacy Policy** 55 | 56 | I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page. 57 | 58 | This policy is effective as of 2020-10-02 59 | 60 | **Contact Us** 61 | 62 | If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me at akshaymaurya3006@gmail.com. 63 | 64 | This privacy policy page was created at [privacypolicytemplate.net](https://privacypolicytemplate.net) and modified/generated by [App Privacy Policy Generator](https://app-privacy-policy-generator.firebaseapp.com/) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #
icon Flutter Image Editor
2 | 3 |
This is a beautiful open-source image-editing app for Android/iOS. It is built with Dart on top of Google's Flutter Framework. 4 | 5 | 6 | ![flutter](https://img.shields.io/badge/Flutter-Framework-green?logo=flutter) 7 | ![Dart](https://img.shields.io/badge/Dart-Language-blue?logo=dart) 8 | ![License](https://img.shields.io/github/license/codenameakshay/image-editor) 9 | ![Size](https://img.shields.io/github/repo-size/codenameakshay/image-editor?color=green) 10 | ![Stars](https://img.shields.io/github/stars/codenameakshay/image-editor) 11 | 12 | 13 |
14 | Prism UI Mockup 15 | 16 | This app offers image editing features like Saturation, Brightness, Crop, Contrast, Rotation & Flip in an easy-to-use minimalistic approach. It can export the edited images in high quality, or directly share them to other apps like WhatsApp, Twitter, Instagram, etc. 17 | 18 | ## List of Contents 19 | 20 | 1. [Features](#features) 21 | 2. [Demo](#demo) 22 | 3. [Support](#support) 23 | 4. [Dependencies](#dependencies) 24 | 5. [Contributing](#contributing) 25 | 6. [License](#license) 26 | 7. [Contributors](#contributors) 27 | 28 | ## Features 29 | 30 | - High-Quality Exports 31 | - Edit images easily, with beautiful UI 32 | - Edit features like Saturation, Brightness & Contrast 33 | - Crop, Rotate and Flip images to match your perspective 34 | - Offline App (Needs no internet connection) 35 | - Saves images to gallery directly, for easy viewing 36 | - Minimal design with smooth transitions and animations 37 | - Optimized storage using minimal packages 38 | - Application size under 6 MB 39 | 40 | ## Demo 41 | 42 | **Screens** 43 | 44 | | ![](demo/1.jpg) | ![](demo/2.jpg) | ![](demo/3.jpg) | ![](demo/4.jpg) | ![](demo/5.jpg) | 45 | | :-------------: | :-------------: | :-------------: | :-------------: | :-------------: | 46 | | Home | Edit Photo (Unedited) | Edit Photo (Edited) | Save Image | Saved in Gallery | 47 | 48 | 49 | ## Support 50 | 51 | If you like what we do, and would want to help us continue doing it, consider sponsoring this project. 52 | 53 | Buy Me A Coffee 54 | 55 | ## Dependencies 56 | 57 | The following packages are needed for the development of this application. 58 | 59 | - `share: ^0.6.4` for sharing the edited image 60 | - `gallery_saver: ^2.0.1` for saving images to gallery 61 | - `image_picker: ^0.6.7+4` for picking images 62 | - `photo_view: ^0.9.2` for showing images before saving 63 | - `cached_network_image: ^2.2.0+1` for caching images 64 | - `image_editor: ^0.7.1` for editing images 65 | - `extended_image: ^0.9.0` for cropping images 66 | 67 | More details about these can be found in the [`pubspec.yaml`](https://github.com/codenameakshay/image-editor/tree/master/pubspec.yaml) file. 68 | 69 | ## Contributing 70 | 71 | First off, thank you for considering contributing to this app. It's people like you that make it such a great app. 72 | 73 | To start your lovely journey with this app, first read the [`contributing guidelines`](https://github.com/codenameakshay/image-editor/tree/master/CONTRIBUTING.md) and then fork the repo to start contributing! 74 | 75 | ## License 76 | 77 | This app is licensed under the [`BSD 3-Clause License`](https://github.com/codenameakshay/image-editor/tree/master/LICENSE.txt). 78 | Any Usage of the source code must follow the below license. 79 | 80 | ``` 81 | BSD 3-Clause License 82 | 83 | Copyright (c) 2020 Akshay Maurya 84 | All rights reserved. 85 | 86 | Redistribution and use in source and binary forms, with or without 87 | modification, are permitted provided that the following conditions are met: 88 | 89 | 1. Redistributions of source code must retain the above copyright notice, this 90 | list of conditions and the following disclaimer. 91 | 92 | 2. Redistributions in binary form must reproduce the above copyright notice, 93 | this list of conditions and the following disclaimer in the documentation 94 | and/or other materials provided with the distribution. 95 | 96 | 3. Neither the name of the copyright holder nor the names of its 97 | contributors may be used to endorse or promote products derived from 98 | this software without specific prior written permission. 99 | 100 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 101 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 102 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 103 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 104 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 105 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 106 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 107 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 108 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 109 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 110 | ``` 111 | 112 | ``` 113 | DISCLAIMER: Google Play and the Google Play logo are trademarks of Google LLC. 114 | ``` 115 | 116 | ## Contributors 117 | 118 | 119 | 120 | 121 | 122 | ## If you made it here, thanks for your support. You can show more support by forking or starring this repo. See ya! 123 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion 28 30 | 31 | sourceSets { 32 | main.java.srcDirs += 'src/main/kotlin' 33 | } 34 | 35 | lintOptions { 36 | disable 'InvalidPackage' 37 | } 38 | 39 | defaultConfig { 40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 41 | applicationId "com.example.image_editor" 42 | minSdkVersion 16 43 | targetSdkVersion 28 44 | versionCode flutterVersionCode.toInteger() 45 | versionName flutterVersionName 46 | } 47 | 48 | buildTypes { 49 | release { 50 | // TODO: Add your own signing config for the release build. 51 | // Signing with the debug keys for now, so `flutter run --release` works. 52 | minifyEnabled true 53 | shrinkResources true 54 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 55 | signingConfig signingConfigs.debug 56 | } 57 | } 58 | } 59 | 60 | flutter { 61 | source '../..' 62 | } 63 | 64 | dependencies { 65 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 66 | } 67 | -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | ## Flutter wrapper 2 | -keep class io.flutter.app.** { *; } 3 | -keep class io.flutter.plugin.** { *; } 4 | -keep class io.flutter.util.** { *; } 5 | -keep class io.flutter.view.** { *; } 6 | -keep class io.flutter.** { *; } 7 | -keep class io.flutter.plugins.** { *; } 8 | -dontwarn io.flutter.embedding.** 9 | -ignorewarnings -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | 12 | 19 | 23 | 27 | 32 | 36 | 37 | 38 | 39 | 40 | 41 | 43 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/image_editor/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.image_editor 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.5.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | jcenter() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.enableR8=true 3 | android.useAndroidX=true 4 | android.enableJetifier=true 5 | extra-gen-snapshot-options=--obfuscate 6 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | // Copyright 2014 The Flutter Authors. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | include ':app' 6 | 7 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 8 | def properties = new Properties() 9 | 10 | assert localPropertiesFile.exists() 11 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 12 | 13 | def flutterSdkPath = properties.getProperty("flutter.sdk") 14 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 15 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 16 | -------------------------------------------------------------------------------- /assets/images/homescreen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/assets/images/homescreen.jpg -------------------------------------------------------------------------------- /demo/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/demo/1.jpg -------------------------------------------------------------------------------- /demo/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/demo/2.jpg -------------------------------------------------------------------------------- /demo/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/demo/3.jpg -------------------------------------------------------------------------------- /demo/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/demo/4.jpg -------------------------------------------------------------------------------- /demo/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/demo/5.jpg -------------------------------------------------------------------------------- /demo/ImageMockup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/demo/ImageMockup.png -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 9740EEB11CF90186004384FC /* Flutter */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 65 | ); 66 | name = Flutter; 67 | sourceTree = ""; 68 | }; 69 | 97C146E51CF9000F007C117D = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9740EEB11CF90186004384FC /* Flutter */, 73 | 97C146F01CF9000F007C117D /* Runner */, 74 | 97C146EF1CF9000F007C117D /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 97C146EF1CF9000F007C117D /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 97C146EE1CF9000F007C117D /* Runner.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 97C146F01CF9000F007C117D /* Runner */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 92 | 97C147021CF9000F007C117D /* Info.plist */, 93 | 97C146F11CF9000F007C117D /* Supporting Files */, 94 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 95 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 96 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 97 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 98 | ); 99 | path = Runner; 100 | sourceTree = ""; 101 | }; 102 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | ); 106 | name = "Supporting Files"; 107 | sourceTree = ""; 108 | }; 109 | /* End PBXGroup section */ 110 | 111 | /* Begin PBXNativeTarget section */ 112 | 97C146ED1CF9000F007C117D /* Runner */ = { 113 | isa = PBXNativeTarget; 114 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 115 | buildPhases = ( 116 | 9740EEB61CF901F6004384FC /* Run Script */, 117 | 97C146EA1CF9000F007C117D /* Sources */, 118 | 97C146EB1CF9000F007C117D /* Frameworks */, 119 | 97C146EC1CF9000F007C117D /* Resources */, 120 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 121 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 122 | ); 123 | buildRules = ( 124 | ); 125 | dependencies = ( 126 | ); 127 | name = Runner; 128 | productName = Runner; 129 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 130 | productType = "com.apple.product-type.application"; 131 | }; 132 | /* End PBXNativeTarget section */ 133 | 134 | /* Begin PBXProject section */ 135 | 97C146E61CF9000F007C117D /* Project object */ = { 136 | isa = PBXProject; 137 | attributes = { 138 | LastUpgradeCheck = 1020; 139 | ORGANIZATIONNAME = ""; 140 | TargetAttributes = { 141 | 97C146ED1CF9000F007C117D = { 142 | CreatedOnToolsVersion = 7.3.1; 143 | LastSwiftMigration = 1100; 144 | }; 145 | }; 146 | }; 147 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 148 | compatibilityVersion = "Xcode 9.3"; 149 | developmentRegion = en; 150 | hasScannedForEncodings = 0; 151 | knownRegions = ( 152 | en, 153 | Base, 154 | ); 155 | mainGroup = 97C146E51CF9000F007C117D; 156 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 157 | projectDirPath = ""; 158 | projectRoot = ""; 159 | targets = ( 160 | 97C146ED1CF9000F007C117D /* Runner */, 161 | ); 162 | }; 163 | /* End PBXProject section */ 164 | 165 | /* Begin PBXResourcesBuildPhase section */ 166 | 97C146EC1CF9000F007C117D /* Resources */ = { 167 | isa = PBXResourcesBuildPhase; 168 | buildActionMask = 2147483647; 169 | files = ( 170 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 171 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 172 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 173 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 174 | ); 175 | runOnlyForDeploymentPostprocessing = 0; 176 | }; 177 | /* End PBXResourcesBuildPhase section */ 178 | 179 | /* Begin PBXShellScriptBuildPhase section */ 180 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 181 | isa = PBXShellScriptBuildPhase; 182 | buildActionMask = 2147483647; 183 | files = ( 184 | ); 185 | inputPaths = ( 186 | ); 187 | name = "Thin Binary"; 188 | outputPaths = ( 189 | ); 190 | runOnlyForDeploymentPostprocessing = 0; 191 | shellPath = /bin/sh; 192 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 193 | }; 194 | 9740EEB61CF901F6004384FC /* Run Script */ = { 195 | isa = PBXShellScriptBuildPhase; 196 | buildActionMask = 2147483647; 197 | files = ( 198 | ); 199 | inputPaths = ( 200 | ); 201 | name = "Run Script"; 202 | outputPaths = ( 203 | ); 204 | runOnlyForDeploymentPostprocessing = 0; 205 | shellPath = /bin/sh; 206 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 207 | }; 208 | /* End PBXShellScriptBuildPhase section */ 209 | 210 | /* Begin PBXSourcesBuildPhase section */ 211 | 97C146EA1CF9000F007C117D /* Sources */ = { 212 | isa = PBXSourcesBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 216 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 217 | ); 218 | runOnlyForDeploymentPostprocessing = 0; 219 | }; 220 | /* End PBXSourcesBuildPhase section */ 221 | 222 | /* Begin PBXVariantGroup section */ 223 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 224 | isa = PBXVariantGroup; 225 | children = ( 226 | 97C146FB1CF9000F007C117D /* Base */, 227 | ); 228 | name = Main.storyboard; 229 | sourceTree = ""; 230 | }; 231 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 232 | isa = PBXVariantGroup; 233 | children = ( 234 | 97C147001CF9000F007C117D /* Base */, 235 | ); 236 | name = LaunchScreen.storyboard; 237 | sourceTree = ""; 238 | }; 239 | /* End PBXVariantGroup section */ 240 | 241 | /* Begin XCBuildConfiguration section */ 242 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 243 | isa = XCBuildConfiguration; 244 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 245 | buildSettings = { 246 | ALWAYS_SEARCH_USER_PATHS = NO; 247 | CLANG_ANALYZER_NONNULL = YES; 248 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 249 | CLANG_CXX_LIBRARY = "libc++"; 250 | CLANG_ENABLE_MODULES = YES; 251 | CLANG_ENABLE_OBJC_ARC = YES; 252 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 253 | CLANG_WARN_BOOL_CONVERSION = YES; 254 | CLANG_WARN_COMMA = YES; 255 | CLANG_WARN_CONSTANT_CONVERSION = YES; 256 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 257 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 258 | CLANG_WARN_EMPTY_BODY = YES; 259 | CLANG_WARN_ENUM_CONVERSION = YES; 260 | CLANG_WARN_INFINITE_RECURSION = YES; 261 | CLANG_WARN_INT_CONVERSION = YES; 262 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 263 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 264 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 265 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 266 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 267 | CLANG_WARN_STRICT_PROTOTYPES = YES; 268 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 269 | CLANG_WARN_UNREACHABLE_CODE = YES; 270 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 271 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 272 | COPY_PHASE_STRIP = NO; 273 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 274 | ENABLE_NS_ASSERTIONS = NO; 275 | ENABLE_STRICT_OBJC_MSGSEND = YES; 276 | GCC_C_LANGUAGE_STANDARD = gnu99; 277 | GCC_NO_COMMON_BLOCKS = YES; 278 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 279 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 280 | GCC_WARN_UNDECLARED_SELECTOR = YES; 281 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 282 | GCC_WARN_UNUSED_FUNCTION = YES; 283 | GCC_WARN_UNUSED_VARIABLE = YES; 284 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 285 | MTL_ENABLE_DEBUG_INFO = NO; 286 | SDKROOT = iphoneos; 287 | SUPPORTED_PLATFORMS = iphoneos; 288 | TARGETED_DEVICE_FAMILY = "1,2"; 289 | VALIDATE_PRODUCT = YES; 290 | }; 291 | name = Profile; 292 | }; 293 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 294 | isa = XCBuildConfiguration; 295 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 296 | buildSettings = { 297 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 298 | CLANG_ENABLE_MODULES = YES; 299 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 300 | ENABLE_BITCODE = NO; 301 | FRAMEWORK_SEARCH_PATHS = ( 302 | "$(inherited)", 303 | "$(PROJECT_DIR)/Flutter", 304 | ); 305 | INFOPLIST_FILE = Runner/Info.plist; 306 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 307 | LIBRARY_SEARCH_PATHS = ( 308 | "$(inherited)", 309 | "$(PROJECT_DIR)/Flutter", 310 | ); 311 | PRODUCT_BUNDLE_IDENTIFIER = com.example.imageEditor; 312 | PRODUCT_NAME = "$(TARGET_NAME)"; 313 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 314 | SWIFT_VERSION = 5.0; 315 | VERSIONING_SYSTEM = "apple-generic"; 316 | }; 317 | name = Profile; 318 | }; 319 | 97C147031CF9000F007C117D /* Debug */ = { 320 | isa = XCBuildConfiguration; 321 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 322 | buildSettings = { 323 | ALWAYS_SEARCH_USER_PATHS = NO; 324 | CLANG_ANALYZER_NONNULL = YES; 325 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 326 | CLANG_CXX_LIBRARY = "libc++"; 327 | CLANG_ENABLE_MODULES = YES; 328 | CLANG_ENABLE_OBJC_ARC = YES; 329 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 330 | CLANG_WARN_BOOL_CONVERSION = YES; 331 | CLANG_WARN_COMMA = YES; 332 | CLANG_WARN_CONSTANT_CONVERSION = YES; 333 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 334 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 335 | CLANG_WARN_EMPTY_BODY = YES; 336 | CLANG_WARN_ENUM_CONVERSION = YES; 337 | CLANG_WARN_INFINITE_RECURSION = YES; 338 | CLANG_WARN_INT_CONVERSION = YES; 339 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 340 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 341 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 342 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 343 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 344 | CLANG_WARN_STRICT_PROTOTYPES = YES; 345 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 346 | CLANG_WARN_UNREACHABLE_CODE = YES; 347 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 348 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 349 | COPY_PHASE_STRIP = NO; 350 | DEBUG_INFORMATION_FORMAT = dwarf; 351 | ENABLE_STRICT_OBJC_MSGSEND = YES; 352 | ENABLE_TESTABILITY = YES; 353 | GCC_C_LANGUAGE_STANDARD = gnu99; 354 | GCC_DYNAMIC_NO_PIC = NO; 355 | GCC_NO_COMMON_BLOCKS = YES; 356 | GCC_OPTIMIZATION_LEVEL = 0; 357 | GCC_PREPROCESSOR_DEFINITIONS = ( 358 | "DEBUG=1", 359 | "$(inherited)", 360 | ); 361 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 362 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 363 | GCC_WARN_UNDECLARED_SELECTOR = YES; 364 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 365 | GCC_WARN_UNUSED_FUNCTION = YES; 366 | GCC_WARN_UNUSED_VARIABLE = YES; 367 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 368 | MTL_ENABLE_DEBUG_INFO = YES; 369 | ONLY_ACTIVE_ARCH = YES; 370 | SDKROOT = iphoneos; 371 | TARGETED_DEVICE_FAMILY = "1,2"; 372 | }; 373 | name = Debug; 374 | }; 375 | 97C147041CF9000F007C117D /* Release */ = { 376 | isa = XCBuildConfiguration; 377 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 378 | buildSettings = { 379 | ALWAYS_SEARCH_USER_PATHS = NO; 380 | CLANG_ANALYZER_NONNULL = YES; 381 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 382 | CLANG_CXX_LIBRARY = "libc++"; 383 | CLANG_ENABLE_MODULES = YES; 384 | CLANG_ENABLE_OBJC_ARC = YES; 385 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 386 | CLANG_WARN_BOOL_CONVERSION = YES; 387 | CLANG_WARN_COMMA = YES; 388 | CLANG_WARN_CONSTANT_CONVERSION = YES; 389 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 390 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 391 | CLANG_WARN_EMPTY_BODY = YES; 392 | CLANG_WARN_ENUM_CONVERSION = YES; 393 | CLANG_WARN_INFINITE_RECURSION = YES; 394 | CLANG_WARN_INT_CONVERSION = YES; 395 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 396 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 397 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 398 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 399 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 400 | CLANG_WARN_STRICT_PROTOTYPES = YES; 401 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 402 | CLANG_WARN_UNREACHABLE_CODE = YES; 403 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 404 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 405 | COPY_PHASE_STRIP = NO; 406 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 407 | ENABLE_NS_ASSERTIONS = NO; 408 | ENABLE_STRICT_OBJC_MSGSEND = YES; 409 | GCC_C_LANGUAGE_STANDARD = gnu99; 410 | GCC_NO_COMMON_BLOCKS = YES; 411 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 412 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 413 | GCC_WARN_UNDECLARED_SELECTOR = YES; 414 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 415 | GCC_WARN_UNUSED_FUNCTION = YES; 416 | GCC_WARN_UNUSED_VARIABLE = YES; 417 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 418 | MTL_ENABLE_DEBUG_INFO = NO; 419 | SDKROOT = iphoneos; 420 | SUPPORTED_PLATFORMS = iphoneos; 421 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 422 | TARGETED_DEVICE_FAMILY = "1,2"; 423 | VALIDATE_PRODUCT = YES; 424 | }; 425 | name = Release; 426 | }; 427 | 97C147061CF9000F007C117D /* Debug */ = { 428 | isa = XCBuildConfiguration; 429 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 430 | buildSettings = { 431 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 432 | CLANG_ENABLE_MODULES = YES; 433 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 434 | ENABLE_BITCODE = NO; 435 | FRAMEWORK_SEARCH_PATHS = ( 436 | "$(inherited)", 437 | "$(PROJECT_DIR)/Flutter", 438 | ); 439 | INFOPLIST_FILE = Runner/Info.plist; 440 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 441 | LIBRARY_SEARCH_PATHS = ( 442 | "$(inherited)", 443 | "$(PROJECT_DIR)/Flutter", 444 | ); 445 | PRODUCT_BUNDLE_IDENTIFIER = com.example.imageEditor; 446 | PRODUCT_NAME = "$(TARGET_NAME)"; 447 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 448 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 449 | SWIFT_VERSION = 5.0; 450 | VERSIONING_SYSTEM = "apple-generic"; 451 | }; 452 | name = Debug; 453 | }; 454 | 97C147071CF9000F007C117D /* Release */ = { 455 | isa = XCBuildConfiguration; 456 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 457 | buildSettings = { 458 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 459 | CLANG_ENABLE_MODULES = YES; 460 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 461 | ENABLE_BITCODE = NO; 462 | FRAMEWORK_SEARCH_PATHS = ( 463 | "$(inherited)", 464 | "$(PROJECT_DIR)/Flutter", 465 | ); 466 | INFOPLIST_FILE = Runner/Info.plist; 467 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 468 | LIBRARY_SEARCH_PATHS = ( 469 | "$(inherited)", 470 | "$(PROJECT_DIR)/Flutter", 471 | ); 472 | PRODUCT_BUNDLE_IDENTIFIER = com.example.imageEditor; 473 | PRODUCT_NAME = "$(TARGET_NAME)"; 474 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 475 | SWIFT_VERSION = 5.0; 476 | VERSIONING_SYSTEM = "apple-generic"; 477 | }; 478 | name = Release; 479 | }; 480 | /* End XCBuildConfiguration section */ 481 | 482 | /* Begin XCConfigurationList section */ 483 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 484 | isa = XCConfigurationList; 485 | buildConfigurations = ( 486 | 97C147031CF9000F007C117D /* Debug */, 487 | 97C147041CF9000F007C117D /* Release */, 488 | 249021D3217E4FDB00AE95B9 /* Profile */, 489 | ); 490 | defaultConfigurationIsVisible = 0; 491 | defaultConfigurationName = Release; 492 | }; 493 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 494 | isa = XCConfigurationList; 495 | buildConfigurations = ( 496 | 97C147061CF9000F007C117D /* Debug */, 497 | 97C147071CF9000F007C117D /* Release */, 498 | 249021D4217E4FDB00AE95B9 /* Profile */, 499 | ); 500 | defaultConfigurationIsVisible = 0; 501 | defaultConfigurationName = Release; 502 | }; 503 | /* End XCConfigurationList section */ 504 | }; 505 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 506 | } 507 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenameakshay/image-editor/2876f1c9e5eda4daf316c50581f014af3144885c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | image_editor 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/editScreen.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | import 'package:flutter/cupertino.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'dart:convert'; 5 | import 'dart:typed_data'; 6 | import 'package:extended_image/extended_image.dart'; 7 | import 'package:flutter_image_editor/saveScreen.dart'; 8 | import 'package:image_editor/image_editor.dart' hide ImageSource; 9 | 10 | class EditPhotoScreen extends StatefulWidget { 11 | final List arguments; 12 | EditPhotoScreen({this.arguments}); 13 | @override 14 | _EditPhotoScreenState createState() => _EditPhotoScreenState(); 15 | } 16 | 17 | class _EditPhotoScreenState extends State { 18 | final GlobalKey editorKey = 19 | GlobalKey(); 20 | 21 | double sat = 1; 22 | double bright = 0; 23 | double con = 1; 24 | 25 | final defaultColorMatrix = const [ 26 | 1, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 1, 33 | 0, 34 | 0, 35 | 0, 36 | 0, 37 | 0, 38 | 1, 39 | 0, 40 | 0, 41 | 0, 42 | 0, 43 | 0, 44 | 1, 45 | 0 46 | ]; 47 | List calculateSaturationMatrix(double saturation) { 48 | final m = List.from(defaultColorMatrix); 49 | final invSat = 1 - saturation; 50 | final R = 0.213 * invSat; 51 | final G = 0.715 * invSat; 52 | final B = 0.072 * invSat; 53 | 54 | m[0] = R + saturation; 55 | m[1] = G; 56 | m[2] = B; 57 | m[5] = R; 58 | m[6] = G + saturation; 59 | m[7] = B; 60 | m[10] = R; 61 | m[11] = G; 62 | m[12] = B + saturation; 63 | 64 | return m; 65 | } 66 | 67 | List calculateContrastMatrix(double contrast) { 68 | final m = List.from(defaultColorMatrix); 69 | m[0] = contrast; 70 | m[6] = contrast; 71 | m[12] = contrast; 72 | return m; 73 | } 74 | 75 | File image; 76 | @override 77 | void initState() { 78 | super.initState(); 79 | image = widget.arguments[0]; 80 | } 81 | 82 | @override 83 | Widget build(BuildContext context) { 84 | return Scaffold( 85 | backgroundColor: Theme.of(context).primaryColor, 86 | appBar: AppBar( 87 | title: Text( 88 | "Edit Image", 89 | style: TextStyle(color: Colors.white), 90 | ), 91 | actions: [ 92 | IconButton( 93 | icon: Icon(Icons.settings_backup_restore), 94 | onPressed: () { 95 | setState(() { 96 | sat = 1; 97 | bright = 0; 98 | con = 1; 99 | }); 100 | }, 101 | ), 102 | IconButton( 103 | icon: Icon(Icons.check), 104 | onPressed: () async { 105 | await crop(); 106 | }, 107 | ), 108 | ]), 109 | body: SingleChildScrollView( 110 | child: Container( 111 | width: MediaQuery.of(context).size.width, 112 | height: MediaQuery.of(context).size.height, 113 | child: Column( 114 | children: [ 115 | SizedBox( 116 | height: MediaQuery.of(context).size.width, 117 | width: MediaQuery.of(context).size.width, 118 | child: AspectRatio( 119 | aspectRatio: 1, 120 | child: buildImage(), 121 | ), 122 | ), 123 | SizedBox( 124 | height: MediaQuery.of(context).size.height - 125 | MediaQuery.of(context).size.width, 126 | width: MediaQuery.of(context).size.width, 127 | child: SliderTheme( 128 | data: const SliderThemeData( 129 | showValueIndicator: ShowValueIndicator.never, 130 | ), 131 | child: Container( 132 | color: Colors.white, 133 | child: Column( 134 | mainAxisAlignment: MainAxisAlignment.center, 135 | children: [ 136 | Spacer(flex: 3), 137 | _buildSat(), 138 | Spacer(flex: 1), 139 | _buildBrightness(), 140 | Spacer(flex: 1), 141 | _buildCon(), 142 | Spacer(flex: 3), 143 | ], 144 | ), 145 | ), 146 | ), 147 | ), 148 | ], 149 | ), 150 | ), 151 | ), 152 | bottomNavigationBar: _buildFunctions(), 153 | ); 154 | } 155 | 156 | Widget buildImage() { 157 | return ColorFiltered( 158 | colorFilter: ColorFilter.matrix(calculateContrastMatrix(con)), 159 | child: ColorFiltered( 160 | colorFilter: ColorFilter.matrix(calculateSaturationMatrix(sat)), 161 | child: ExtendedImage( 162 | color: bright > 0 163 | ? Colors.white.withOpacity(bright) 164 | : Colors.black.withOpacity(-bright), 165 | colorBlendMode: bright > 0 ? BlendMode.lighten : BlendMode.darken, 166 | image: ExtendedFileImageProvider(image), 167 | height: MediaQuery.of(context).size.width, 168 | width: MediaQuery.of(context).size.width, 169 | extendedImageEditorKey: editorKey, 170 | mode: ExtendedImageMode.editor, 171 | fit: BoxFit.contain, 172 | initEditorConfigHandler: (ExtendedImageState state) { 173 | return EditorConfig( 174 | maxScale: 8.0, 175 | cropRectPadding: const EdgeInsets.all(20.0), 176 | hitTestSize: 20.0, 177 | ); 178 | }, 179 | ), 180 | ), 181 | ); 182 | } 183 | 184 | Widget _buildFunctions() { 185 | return BottomNavigationBar( 186 | backgroundColor: Theme.of(context).primaryColor, 187 | items: [ 188 | BottomNavigationBarItem( 189 | icon: Icon( 190 | Icons.flip, 191 | color: Colors.white, 192 | ), 193 | title: Text( 194 | 'Flip', 195 | style: TextStyle( 196 | color: Colors.white, 197 | ), 198 | ), 199 | ), 200 | BottomNavigationBarItem( 201 | icon: Icon( 202 | Icons.rotate_left, 203 | color: Colors.white, 204 | ), 205 | title: Text( 206 | 'Rotate left', 207 | style: TextStyle( 208 | color: Colors.white, 209 | ), 210 | ), 211 | ), 212 | BottomNavigationBarItem( 213 | icon: Icon( 214 | Icons.rotate_right, 215 | color: Colors.white, 216 | ), 217 | title: Text( 218 | 'Rotate right', 219 | style: TextStyle( 220 | color: Colors.white, 221 | ), 222 | ), 223 | ), 224 | ], 225 | onTap: (int index) { 226 | switch (index) { 227 | case 0: 228 | flip(); 229 | break; 230 | case 1: 231 | rotate(false); 232 | break; 233 | case 2: 234 | rotate(true); 235 | break; 236 | } 237 | }, 238 | currentIndex: 0, 239 | selectedItemColor: Theme.of(context).primaryColor, 240 | unselectedItemColor: Theme.of(context).primaryColor, 241 | ); 242 | } 243 | 244 | Future crop([bool test = false]) async { 245 | final ExtendedImageEditorState state = editorKey.currentState; 246 | final Rect rect = state.getCropRect(); 247 | final EditActionDetails action = state.editAction; 248 | final double radian = action.rotateAngle; 249 | 250 | final bool flipHorizontal = action.flipY; 251 | final bool flipVertical = action.flipX; 252 | final Uint8List img = state.rawImageData; 253 | 254 | final ImageEditorOption option = ImageEditorOption(); 255 | 256 | option.addOption(ClipOption.fromRect(rect)); 257 | option.addOption( 258 | FlipOption(horizontal: flipHorizontal, vertical: flipVertical)); 259 | if (action.hasRotateAngle) { 260 | option.addOption(RotateOption(radian.toInt())); 261 | } 262 | 263 | option.addOption(ColorOption.saturation(sat)); 264 | option.addOption(ColorOption.brightness(bright + 1)); 265 | option.addOption(ColorOption.contrast(con)); 266 | 267 | option.outputFormat = const OutputFormat.jpeg(100); 268 | 269 | print(const JsonEncoder.withIndent(' ').convert(option.toJson())); 270 | 271 | final DateTime start = DateTime.now(); 272 | final Uint8List result = await ImageEditor.editImage( 273 | image: img, 274 | imageEditorOption: option, 275 | ); 276 | 277 | print('result.length = ${result.length}'); 278 | 279 | final Duration diff = DateTime.now().difference(start); 280 | image.writeAsBytesSync(result); 281 | print('image_editor time : $diff'); 282 | Future.delayed(Duration(seconds: 0)).then( 283 | (value) => Navigator.pushReplacement( 284 | context, 285 | CupertinoPageRoute( 286 | builder: (context) => SaveImageScreen( 287 | arguments: [image], 288 | )), 289 | ), 290 | ); 291 | } 292 | 293 | void flip() { 294 | editorKey.currentState.flip(); 295 | } 296 | 297 | void rotate(bool right) { 298 | editorKey.currentState.rotate(right: right); 299 | } 300 | 301 | Widget _buildSat() { 302 | return Row( 303 | mainAxisAlignment: MainAxisAlignment.end, 304 | mainAxisSize: MainAxisSize.max, 305 | children: [ 306 | SizedBox( 307 | width: MediaQuery.of(context).size.width * 0.03, 308 | ), 309 | Column( 310 | children: [ 311 | Icon( 312 | Icons.brush, 313 | color: Theme.of(context).accentColor, 314 | ), 315 | Text( 316 | "Saturation", 317 | style: TextStyle(color: Theme.of(context).accentColor), 318 | ) 319 | ], 320 | ), 321 | Container( 322 | width: MediaQuery.of(context).size.width * 0.6, 323 | child: Slider( 324 | label: 'sat : ${sat.toStringAsFixed(2)}', 325 | onChanged: (double value) { 326 | setState(() { 327 | sat = value; 328 | }); 329 | }, 330 | divisions: 50, 331 | value: sat, 332 | min: 0, 333 | max: 2, 334 | ), 335 | ), 336 | Padding( 337 | padding: 338 | EdgeInsets.only(right: MediaQuery.of(context).size.width * 0.08), 339 | child: Text(sat.toStringAsFixed(2)), 340 | ), 341 | ], 342 | ); 343 | } 344 | 345 | Widget _buildBrightness() { 346 | return Row( 347 | mainAxisAlignment: MainAxisAlignment.end, 348 | mainAxisSize: MainAxisSize.max, 349 | children: [ 350 | SizedBox( 351 | width: MediaQuery.of(context).size.width * 0.03, 352 | ), 353 | Column( 354 | children: [ 355 | Icon( 356 | Icons.brightness_4, 357 | color: Theme.of(context).accentColor, 358 | ), 359 | Text( 360 | "Brightness", 361 | style: TextStyle(color: Theme.of(context).accentColor), 362 | ) 363 | ], 364 | ), 365 | Container( 366 | width: MediaQuery.of(context).size.width * 0.6, 367 | child: Slider( 368 | label: '${bright.toStringAsFixed(2)}', 369 | onChanged: (double value) { 370 | setState(() { 371 | bright = value; 372 | }); 373 | }, 374 | divisions: 50, 375 | value: bright, 376 | min: -1, 377 | max: 1, 378 | ), 379 | ), 380 | Padding( 381 | padding: 382 | EdgeInsets.only(right: MediaQuery.of(context).size.width * 0.08), 383 | child: Text(bright.toStringAsFixed(2)), 384 | ), 385 | ], 386 | ); 387 | } 388 | 389 | Widget _buildCon() { 390 | return Row( 391 | mainAxisAlignment: MainAxisAlignment.end, 392 | mainAxisSize: MainAxisSize.max, 393 | children: [ 394 | SizedBox( 395 | width: MediaQuery.of(context).size.width * 0.03, 396 | ), 397 | Column( 398 | children: [ 399 | Icon( 400 | Icons.color_lens, 401 | color: Theme.of(context).accentColor, 402 | ), 403 | Text( 404 | "Contrast", 405 | style: TextStyle(color: Theme.of(context).accentColor), 406 | ) 407 | ], 408 | ), 409 | Container( 410 | width: MediaQuery.of(context).size.width * 0.6, 411 | child: Slider( 412 | label: 'con : ${con.toStringAsFixed(2)}', 413 | onChanged: (double value) { 414 | setState(() { 415 | con = value; 416 | }); 417 | }, 418 | divisions: 50, 419 | value: con, 420 | min: 0, 421 | max: 4, 422 | ), 423 | ), 424 | Padding( 425 | padding: 426 | EdgeInsets.only(right: MediaQuery.of(context).size.width * 0.08), 427 | child: Text(con.toStringAsFixed(2)), 428 | ), 429 | ], 430 | ); 431 | } 432 | } 433 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:flutter/cupertino.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_image_editor/editScreen.dart'; 6 | import 'package:image_picker/image_picker.dart'; 7 | 8 | void main() { 9 | runApp(MyApp()); 10 | } 11 | 12 | class MyApp extends StatelessWidget { 13 | @override 14 | Widget build(BuildContext context) { 15 | return MaterialApp( 16 | debugShowCheckedModeBanner: false, 17 | home: Scaffold(body: SelectBottomPanel())); 18 | } 19 | } 20 | 21 | class SelectBottomPanel extends StatefulWidget { 22 | const SelectBottomPanel({ 23 | Key key, 24 | }) : super(key: key); 25 | 26 | @override 27 | _SelectBottomPanelState createState() => _SelectBottomPanelState(); 28 | } 29 | 30 | class _SelectBottomPanelState extends State { 31 | File _image; 32 | final picker = ImagePicker(); 33 | @override 34 | void initState() { 35 | super.initState(); 36 | } 37 | 38 | Future getImage() async { 39 | final pickedFile = await picker.getImage(source: ImageSource.gallery); 40 | if (pickedFile != null) { 41 | setState(() { 42 | _image = File(pickedFile.path); 43 | }); 44 | Future.delayed(Duration(seconds: 0)).then( 45 | (value) => Navigator.push( 46 | context, 47 | CupertinoPageRoute( 48 | builder: (context) => EditPhotoScreen( 49 | arguments: [_image], 50 | ), 51 | ), 52 | ), 53 | ); 54 | } 55 | } 56 | 57 | @override 58 | Widget build(BuildContext context) { 59 | return Container( 60 | height: MediaQuery.of(context).size.height, 61 | decoration: BoxDecoration( 62 | color: Colors.white, 63 | ), 64 | child: Column( 65 | children: [ 66 | Spacer(), 67 | Text( 68 | "Select image to edit", 69 | style: Theme.of(context).textTheme.headline4, 70 | ), 71 | Spacer(), 72 | Row( 73 | mainAxisAlignment: MainAxisAlignment.center, 74 | mainAxisSize: MainAxisSize.max, 75 | children: [ 76 | Column( 77 | mainAxisAlignment: MainAxisAlignment.center, 78 | mainAxisSize: MainAxisSize.min, 79 | children: [ 80 | Padding( 81 | padding: const EdgeInsets.all(8.0), 82 | child: GestureDetector( 83 | onTap: () async { 84 | await getImage(); 85 | }, 86 | child: Container( 87 | width: MediaQuery.of(context).size.width / 2 - 20, 88 | height: MediaQuery.of(context).size.width / 2 / 0.6625, 89 | child: Stack( 90 | alignment: Alignment.center, 91 | children: [ 92 | Container( 93 | width: MediaQuery.of(context).size.width / 2 - 14, 94 | height: MediaQuery.of(context).size.width / 95 | 2 / 96 | 0.6625, 97 | decoration: BoxDecoration( 98 | color: Theme.of(context) 99 | .primaryColor 100 | .withOpacity(0.2), 101 | border: Border.all( 102 | color: Theme.of(context).primaryColor, 103 | width: 3), 104 | borderRadius: BorderRadius.circular(20), 105 | ), 106 | child: ClipRRect( 107 | borderRadius: BorderRadius.circular(16), 108 | child: Opacity( 109 | opacity: 1, 110 | child: Image.asset( 111 | 'assets/images/homescreen.jpg', 112 | fit: BoxFit.cover, 113 | )), 114 | ), 115 | ), 116 | Padding( 117 | padding: const EdgeInsets.only(top: 60.0), 118 | child: Align( 119 | alignment: Alignment.topCenter, 120 | child: Container( 121 | decoration: BoxDecoration( 122 | border: Border.all( 123 | color: Theme.of(context).primaryColor, 124 | width: 1), 125 | color: Theme.of(context) 126 | .primaryColor 127 | .withOpacity(0.2), 128 | shape: BoxShape.circle), 129 | child: Padding( 130 | padding: const EdgeInsets.all(16.0), 131 | child: Icon( 132 | Icons.image, 133 | color: Theme.of(context).primaryColor, 134 | size: 40, 135 | ), 136 | ), 137 | ), 138 | ), 139 | ), 140 | ], 141 | ), 142 | ), 143 | ), 144 | ), 145 | Text( 146 | "Photos", 147 | style: TextStyle( 148 | fontSize: 16, 149 | color: Theme.of(context).primaryColor, 150 | fontWeight: FontWeight.bold), 151 | ) 152 | ], 153 | ), 154 | ], 155 | ), 156 | Spacer(), 157 | Padding( 158 | padding: const EdgeInsets.fromLTRB(0, 0, 0, 32), 159 | child: Container( 160 | width: MediaQuery.of(context).size.width * 0.8, 161 | child: Text( 162 | "Select image, and edit them easily in a matter of seconds. Save or share them wherever and whenever you want.", 163 | textAlign: TextAlign.center, 164 | style: TextStyle( 165 | fontSize: 13, 166 | color: Theme.of(context).hintColor, 167 | ), 168 | ), 169 | ), 170 | ), 171 | ], 172 | ), 173 | ); 174 | } 175 | } 176 | -------------------------------------------------------------------------------- /lib/saveScreen.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | import 'package:gallery_saver/gallery_saver.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:photo_view/photo_view.dart'; 5 | import 'package:share/share.dart'; 6 | 7 | class SaveImageScreen extends StatefulWidget { 8 | final List arguments; 9 | SaveImageScreen({this.arguments}); 10 | @override 11 | _SaveImageScreenState createState() => _SaveImageScreenState(); 12 | } 13 | 14 | class _SaveImageScreenState extends State { 15 | File image; 16 | bool savedImage; 17 | @override 18 | void initState() { 19 | super.initState(); 20 | image = widget.arguments[0]; 21 | savedImage = false; 22 | } 23 | 24 | Future saveImage() async { 25 | renameImage(); 26 | await GallerySaver.saveImage(image.path, albumName: "PhotoEditor"); 27 | setState(() { 28 | savedImage = true; 29 | }); 30 | } 31 | 32 | void renameImage() { 33 | String ogPath = image.path; 34 | List ogPathList = ogPath.split('/'); 35 | String ogExt = ogPathList[ogPathList.length - 1].split('.')[1]; 36 | DateTime today = new DateTime.now(); 37 | String dateSlug = 38 | "${today.day.toString().padLeft(2, '0')}-${today.month.toString().padLeft(2, '0')}-${today.year.toString()}_${today.hour.toString().padLeft(2, '0')}-${today.minute.toString().padLeft(2, '0')}-${today.second.toString().padLeft(2, '0')}"; 39 | image = image.renameSync( 40 | "${ogPath.split('/image')[0]}/PhotoEditor_$dateSlug.$ogExt"); 41 | print(image.path); 42 | } 43 | 44 | void shareImage() { 45 | final RenderBox box = context.findRenderObject(); 46 | if (Platform.isAndroid) { 47 | Share.shareFile(image, 48 | subject: 'Image edited by Photo Editor', 49 | text: 50 | 'Hey, Look what I edited with this amazing app called Photo Editor.', 51 | sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size); 52 | } else { 53 | Share.share( 54 | 'Hey, Look what I edited with this amazing app called Photo Editor.', 55 | subject: 'Image edited by Photo Editor', 56 | sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size); 57 | } 58 | } 59 | 60 | @override 61 | Widget build(BuildContext context) { 62 | return Scaffold( 63 | backgroundColor: Theme.of(context).primaryColor, 64 | appBar: AppBar( 65 | title: Text( 66 | "Export Photo", 67 | style: TextStyle(color: Colors.white), 68 | ), 69 | ), 70 | body: Container( 71 | color: Colors.white, 72 | child: Column( 73 | children: [ 74 | ClipRRect( 75 | child: Container( 76 | color: Theme.of(context).hintColor, 77 | width: MediaQuery.of(context).size.width, 78 | height: MediaQuery.of(context).size.width * 0.9, 79 | child: PhotoView( 80 | imageProvider: FileImage(image), 81 | backgroundDecoration: BoxDecoration( 82 | color: Theme.of(context).hintColor, 83 | ), 84 | ), 85 | ), 86 | ), 87 | // 88 | Spacer(), 89 | Column( 90 | children: [ 91 | Padding( 92 | padding: const EdgeInsets.all(8.0), 93 | child: FloatingActionButton.extended( 94 | disabledElevation: 0, 95 | heroTag: "SAVE", 96 | icon: Icon(Icons.save), 97 | label: savedImage ? Text("SAVED") : Text("SAVE"), 98 | backgroundColor: savedImage 99 | ? Colors.grey 100 | : Theme.of(context).primaryColor, 101 | onPressed: savedImage 102 | ? null 103 | : () { 104 | saveImage(); 105 | }), 106 | ), 107 | Padding( 108 | padding: const EdgeInsets.all(8.0), 109 | child: FloatingActionButton.extended( 110 | heroTag: "SHARE", 111 | icon: Icon(Icons.share), 112 | label: Text("SHARE"), 113 | onPressed: () { 114 | shareImage(); 115 | }), 116 | ) 117 | ], 118 | ), 119 | Spacer(), 120 | Padding( 121 | padding: const EdgeInsets.fromLTRB(0, 0, 0, 24), 122 | child: Row( 123 | mainAxisAlignment: MainAxisAlignment.center, 124 | children: [ 125 | Container( 126 | width: MediaQuery.of(context).size.width * 0.1, 127 | child: Center( 128 | child: Icon( 129 | Icons.info, 130 | color: Theme.of(context).accentColor.withOpacity(0.6), 131 | ), 132 | ), 133 | ), 134 | Container( 135 | width: MediaQuery.of(context).size.width * 0.4, 136 | child: Padding( 137 | padding: const EdgeInsets.all(2.0), 138 | child: Center( 139 | child: Text( 140 | "Note - The images are saved in the best possible quality.", 141 | textAlign: TextAlign.center, 142 | style: TextStyle( 143 | fontSize: 10, 144 | color: 145 | Theme.of(context).accentColor.withOpacity(0.6), 146 | ), 147 | ), 148 | ), 149 | ), 150 | ), 151 | ], 152 | ), 153 | ) 154 | ], 155 | ), 156 | ), 157 | ); 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | archive: 5 | dependency: transitive 6 | description: 7 | name: archive 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.0.13" 11 | args: 12 | dependency: transitive 13 | description: 14 | name: args 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "1.6.0" 18 | async: 19 | dependency: transitive 20 | description: 21 | name: async 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.5.0" 25 | boolean_selector: 26 | dependency: transitive 27 | description: 28 | name: boolean_selector 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "2.1.0" 32 | cached_network_image: 33 | dependency: "direct main" 34 | description: 35 | name: cached_network_image 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "2.2.0+1" 39 | characters: 40 | dependency: transitive 41 | description: 42 | name: characters 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.1.0" 46 | charcode: 47 | dependency: transitive 48 | description: 49 | name: charcode 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.2.0" 53 | clock: 54 | dependency: transitive 55 | description: 56 | name: clock 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.1.0" 60 | collection: 61 | dependency: transitive 62 | description: 63 | name: collection 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "1.15.0" 67 | convert: 68 | dependency: transitive 69 | description: 70 | name: convert 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "2.1.1" 74 | crypto: 75 | dependency: transitive 76 | description: 77 | name: crypto 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "2.1.4" 81 | cupertino_icons: 82 | dependency: "direct main" 83 | description: 84 | name: cupertino_icons 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "0.1.3" 88 | extended_image: 89 | dependency: "direct main" 90 | description: 91 | path: "." 92 | ref: HEAD 93 | resolved-ref: cfbc070fdca9ad58a18c2aa6a5b9705a165dfc49 94 | url: "git://github.com/codenameakshay/extended_image.git" 95 | source: git 96 | version: "1.0.0" 97 | extended_image_library: 98 | dependency: transitive 99 | description: 100 | name: extended_image_library 101 | url: "https://pub.dartlang.org" 102 | source: hosted 103 | version: "0.2.3" 104 | fake_async: 105 | dependency: transitive 106 | description: 107 | name: fake_async 108 | url: "https://pub.dartlang.org" 109 | source: hosted 110 | version: "1.2.0" 111 | file: 112 | dependency: transitive 113 | description: 114 | name: file 115 | url: "https://pub.dartlang.org" 116 | source: hosted 117 | version: "5.2.1" 118 | flutter: 119 | dependency: "direct main" 120 | description: flutter 121 | source: sdk 122 | version: "0.0.0" 123 | flutter_cache_manager: 124 | dependency: transitive 125 | description: 126 | name: flutter_cache_manager 127 | url: "https://pub.dartlang.org" 128 | source: hosted 129 | version: "1.4.2" 130 | flutter_plugin_android_lifecycle: 131 | dependency: transitive 132 | description: 133 | name: flutter_plugin_android_lifecycle 134 | url: "https://pub.dartlang.org" 135 | source: hosted 136 | version: "1.0.8" 137 | flutter_test: 138 | dependency: "direct dev" 139 | description: flutter 140 | source: sdk 141 | version: "0.0.0" 142 | gallery_saver: 143 | dependency: "direct main" 144 | description: 145 | name: gallery_saver 146 | url: "https://pub.dartlang.org" 147 | source: hosted 148 | version: "2.0.1" 149 | http: 150 | dependency: transitive 151 | description: 152 | name: http 153 | url: "https://pub.dartlang.org" 154 | source: hosted 155 | version: "0.12.2" 156 | http_client_helper: 157 | dependency: transitive 158 | description: 159 | name: http_client_helper 160 | url: "https://pub.dartlang.org" 161 | source: hosted 162 | version: "0.2.1" 163 | http_parser: 164 | dependency: transitive 165 | description: 166 | name: http_parser 167 | url: "https://pub.dartlang.org" 168 | source: hosted 169 | version: "3.1.4" 170 | image: 171 | dependency: "direct overridden" 172 | description: 173 | name: image 174 | url: "https://pub.dartlang.org" 175 | source: hosted 176 | version: "2.1.12" 177 | image_editor: 178 | dependency: "direct main" 179 | description: 180 | name: image_editor 181 | url: "https://pub.dartlang.org" 182 | source: hosted 183 | version: "0.7.1" 184 | image_picker: 185 | dependency: "direct main" 186 | description: 187 | name: image_picker 188 | url: "https://pub.dartlang.org" 189 | source: hosted 190 | version: "0.6.7+7" 191 | image_picker_platform_interface: 192 | dependency: transitive 193 | description: 194 | name: image_picker_platform_interface 195 | url: "https://pub.dartlang.org" 196 | source: hosted 197 | version: "1.1.0" 198 | intl: 199 | dependency: transitive 200 | description: 201 | name: intl 202 | url: "https://pub.dartlang.org" 203 | source: hosted 204 | version: "0.16.1" 205 | matcher: 206 | dependency: transitive 207 | description: 208 | name: matcher 209 | url: "https://pub.dartlang.org" 210 | source: hosted 211 | version: "0.12.10" 212 | meta: 213 | dependency: transitive 214 | description: 215 | name: meta 216 | url: "https://pub.dartlang.org" 217 | source: hosted 218 | version: "1.3.0" 219 | path: 220 | dependency: transitive 221 | description: 222 | name: path 223 | url: "https://pub.dartlang.org" 224 | source: hosted 225 | version: "1.8.0" 226 | path_provider: 227 | dependency: transitive 228 | description: 229 | name: path_provider 230 | url: "https://pub.dartlang.org" 231 | source: hosted 232 | version: "1.6.14" 233 | path_provider_linux: 234 | dependency: transitive 235 | description: 236 | name: path_provider_linux 237 | url: "https://pub.dartlang.org" 238 | source: hosted 239 | version: "0.0.1+2" 240 | path_provider_macos: 241 | dependency: transitive 242 | description: 243 | name: path_provider_macos 244 | url: "https://pub.dartlang.org" 245 | source: hosted 246 | version: "0.0.4+3" 247 | path_provider_platform_interface: 248 | dependency: transitive 249 | description: 250 | name: path_provider_platform_interface 251 | url: "https://pub.dartlang.org" 252 | source: hosted 253 | version: "1.0.3" 254 | pedantic: 255 | dependency: transitive 256 | description: 257 | name: pedantic 258 | url: "https://pub.dartlang.org" 259 | source: hosted 260 | version: "1.9.0" 261 | petitparser: 262 | dependency: transitive 263 | description: 264 | name: petitparser 265 | url: "https://pub.dartlang.org" 266 | source: hosted 267 | version: "2.4.0" 268 | photo_view: 269 | dependency: "direct main" 270 | description: 271 | name: photo_view 272 | url: "https://pub.dartlang.org" 273 | source: hosted 274 | version: "0.9.2" 275 | platform: 276 | dependency: transitive 277 | description: 278 | name: platform 279 | url: "https://pub.dartlang.org" 280 | source: hosted 281 | version: "2.2.1" 282 | plugin_platform_interface: 283 | dependency: transitive 284 | description: 285 | name: plugin_platform_interface 286 | url: "https://pub.dartlang.org" 287 | source: hosted 288 | version: "1.0.2" 289 | process: 290 | dependency: transitive 291 | description: 292 | name: process 293 | url: "https://pub.dartlang.org" 294 | source: hosted 295 | version: "3.0.13" 296 | rxdart: 297 | dependency: transitive 298 | description: 299 | name: rxdart 300 | url: "https://pub.dartlang.org" 301 | source: hosted 302 | version: "0.24.1" 303 | share: 304 | dependency: "direct main" 305 | description: 306 | path: "packages/share" 307 | ref: HEAD 308 | resolved-ref: "1494b043d03799dd14e689552d1218918435f9f5" 309 | url: "git://github.com/codenameakshay/plugins.git" 310 | source: git 311 | version: "0.6.2+1" 312 | sky_engine: 313 | dependency: transitive 314 | description: flutter 315 | source: sdk 316 | version: "0.0.99" 317 | source_span: 318 | dependency: transitive 319 | description: 320 | name: source_span 321 | url: "https://pub.dartlang.org" 322 | source: hosted 323 | version: "1.8.0" 324 | sqflite: 325 | dependency: transitive 326 | description: 327 | name: sqflite 328 | url: "https://pub.dartlang.org" 329 | source: hosted 330 | version: "1.3.1+1" 331 | sqflite_common: 332 | dependency: transitive 333 | description: 334 | name: sqflite_common 335 | url: "https://pub.dartlang.org" 336 | source: hosted 337 | version: "1.0.2+1" 338 | stack_trace: 339 | dependency: transitive 340 | description: 341 | name: stack_trace 342 | url: "https://pub.dartlang.org" 343 | source: hosted 344 | version: "1.10.0" 345 | stream_channel: 346 | dependency: transitive 347 | description: 348 | name: stream_channel 349 | url: "https://pub.dartlang.org" 350 | source: hosted 351 | version: "2.1.0" 352 | string_scanner: 353 | dependency: transitive 354 | description: 355 | name: string_scanner 356 | url: "https://pub.dartlang.org" 357 | source: hosted 358 | version: "1.1.0" 359 | synchronized: 360 | dependency: transitive 361 | description: 362 | name: synchronized 363 | url: "https://pub.dartlang.org" 364 | source: hosted 365 | version: "2.2.0+2" 366 | term_glyph: 367 | dependency: transitive 368 | description: 369 | name: term_glyph 370 | url: "https://pub.dartlang.org" 371 | source: hosted 372 | version: "1.2.0" 373 | test_api: 374 | dependency: transitive 375 | description: 376 | name: test_api 377 | url: "https://pub.dartlang.org" 378 | source: hosted 379 | version: "0.2.19" 380 | typed_data: 381 | dependency: transitive 382 | description: 383 | name: typed_data 384 | url: "https://pub.dartlang.org" 385 | source: hosted 386 | version: "1.3.0" 387 | uuid: 388 | dependency: transitive 389 | description: 390 | name: uuid 391 | url: "https://pub.dartlang.org" 392 | source: hosted 393 | version: "2.2.2" 394 | vector_math: 395 | dependency: transitive 396 | description: 397 | name: vector_math 398 | url: "https://pub.dartlang.org" 399 | source: hosted 400 | version: "2.1.0" 401 | xdg_directories: 402 | dependency: transitive 403 | description: 404 | name: xdg_directories 405 | url: "https://pub.dartlang.org" 406 | source: hosted 407 | version: "0.1.0" 408 | xml: 409 | dependency: transitive 410 | description: 411 | name: xml 412 | url: "https://pub.dartlang.org" 413 | source: hosted 414 | version: "3.6.1" 415 | sdks: 416 | dart: ">=2.12.0-0.0 <3.0.0" 417 | flutter: ">=1.17.0" 418 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_image_editor 2 | description: A new Flutter project. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: ">=2.7.0 <3.0.0" 22 | 23 | dependencies: 24 | flutter: 25 | sdk: flutter 26 | 27 | # The following adds the Cupertino Icons font to your application. 28 | # Use with the CupertinoIcons class for iOS style icons. 29 | cupertino_icons: ^0.1.3 30 | image_picker: ^0.6.7+4 31 | cached_network_image: ^2.2.0+1 32 | image_editor: ^0.7.1 33 | extended_image: 34 | git: 35 | url: git://github.com/codenameakshay/extended_image.git 36 | photo_view: ^0.9.2 37 | gallery_saver: ^2.0.1 38 | share: 39 | git: 40 | url: git://github.com/codenameakshay/plugins.git 41 | path: packages/share 42 | 43 | dependency_overrides: 44 | image: 2.1.12 45 | dev_dependencies: 46 | flutter_test: 47 | sdk: flutter 48 | 49 | # For information on the generic Dart part of this file, see the 50 | # following page: https://dart.dev/tools/pub/pubspec 51 | # The following section is specific to Flutter. 52 | flutter: 53 | 54 | # The following line ensures that the Material Icons font is 55 | # included with your application, so that you can use the icons in 56 | # the material Icons class. 57 | uses-material-design: true 58 | 59 | # To add assets to your application, add an assets section, like this: 60 | assets: 61 | - assets/images/ 62 | # - images/a_dot_ham.jpeg 63 | # An image asset can refer to one or more resolution-specific "variants", see 64 | # https://flutter.dev/assets-and-images/#resolution-aware. 65 | # For details regarding adding assets from package dependencies, see 66 | # https://flutter.dev/assets-and-images/#from-packages 67 | # To add custom fonts to your application, add a fonts section here, 68 | # in this "flutter" section. Each entry in this list should have a 69 | # "family" key with the font family name, and a "fonts" key with a 70 | # list giving the asset and other descriptors for the font. For 71 | # example: 72 | # fonts: 73 | # - family: Schyler 74 | # fonts: 75 | # - asset: fonts/Schyler-Regular.ttf 76 | # - asset: fonts/Schyler-Italic.ttf 77 | # style: italic 78 | # - family: Trajan Pro 79 | # fonts: 80 | # - asset: fonts/TrajanPro.ttf 81 | # - asset: fonts/TrajanPro_Bold.ttf 82 | # weight: 700 83 | # 84 | # For details regarding fonts from package dependencies, 85 | # see https://flutter.dev/custom-fonts/#from-packages 86 | 87 | --------------------------------------------------------------------------------