├── .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 | #

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 | 
7 | 
8 | 
9 | 
10 | 
11 |
12 |
13 |
14 |
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 | |  |  |  |  |  |
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 |
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 |
--------------------------------------------------------------------------------