Next-generation of the non-destructive, node-based 2D image graphics editor

Overview

Gimel Studio


Non-destructive, node-based 2D image graphics editor written in Python, focused on simplicity, speed, elegance, and usability
Official Website | Join Our Discord Server | Official Manual

About the Next Generation of Gimel Studio

The previous (now archived) version of Gimel Studio is still available here.

This repository tracks the next step of Gimel Studio (the v0.6.x series) to become a truly usable and serious node-based, non-destructive image editor. It is currently in initial development stage, working towards a usable MVP application. Things will probably change a lot from what is currently here.

We’re especially seeking Python and/or GLSL developers, 3D artists, photographers and UI designers to help with the project. However, even if you have none of these skills you’re still welcome, of course, to ask questions, give feedback, and suggest ideas and improvements. :)

Vision

The main goal is to expand on and greatly improve upon the concepts from the previous version of Gimel Studio to create a serious (yet fun!) 2D graphics editor.

This includes:

  • Re-designed UI (highly inspired by the Blender 2.8x UI and parts of Sketch)
  • Improved file-type support (.tiff, .exr files, etc)
  • 16-bit workflow support
  • CPU and GPU based processing
  • Highly improved node-graph and overall workflow for image editing
  • Greater emphasis on re-usabilty of node graph setups via templates, etc
  • User preferences for customizabilty
  • UI translations and localization
  • Gizmos for the viewport to allow for WYSIWYG-like interaction for transforms, etc. (e.g. crop, rotate, etc)
  • Continued improvement and additions to the Python API for scripting custom nodes

Nodes can be used to composite, create new effects and/or composite raster and vector graphics on-demand. Helpful gizmos in the interactive viewport can be used to do various editing tasks and speed up the workflow. Preset node graph templates can be created, used and re-used to save time setting up common node-setups.

Custom nodes can be scripted with the built-in Python API for maximum flexibility. Integrations with other software like Blender are planned.

With a fully non-destructive workflow that uses both GPU and CPU processing while being seamlessly cross-platform on Windows, Linux and macOS (for 64-bit systems), Gimel Studio aims to be a simple, yet powerful 2D graphics editing tool for anyone with an image to edit.

Visit our home page here for an overview of the project goals, etc

WIP Mockup

Here is a WIP mockup of the redesigned UI:

Discord chat

If you’d like to join development, help with the UI design, UI translations, or have questions, comments, and ideas, you can join the Gimel Studio Discord. This is where you can chat with the developers, designers and project contributors and get the latest updates on development.

If you prefer to keep to Github instead, feel free to start a discussion here.

Status

We are working towards an MVP which will showcase much of the core goals and features listed on the website.

The initial UI is now mostly laid out according to the WIP UI mockup and the core nodegraph rendering is just functional (it “just works”) at the moment. There is much more to do… and we could really use help to speed progress along. ;)

gs-wip-demo The current status of the next generation of Gimel Studio as of 10/5/2021

Take a look at the GitHub Issues for details on immediate and future tasks to be done. Issues labeled “Good first issue” will be the best for new contributors. A familiarity with Python helps, but we are willing to mentor any contributors as needed.

Pull requests are always welcome! :)

Running the code

Please note: At this stage of development, the code is highly WIP and likely to change a lot. Many things are not implemented and not stable. Please don't expect too much at this point...

Windows

  1. pip install -r requirements.txt
  2. Get the OIIO (OpenImageIO) pre-built python wheel (Windows only) here and install it.
  3. cd src
  4. python main.py

Linux

  1. pip3 install -r requirements.txt
  2. If building wxPython fails, Download the wheel file for wxpython which matches your Python version and Linux OS version from https://extras.wxpython.org/wxPython4/extras/linux/ and install the wxpython package with pip3 install
  3. cd src
  4. python3 main.py

Please note that the renderer, which relies on OIIO (OpenImageIO) will not work if OIIO is not found. The rest of the application will run, but the renderer will not work. This essentially means that we do not have Linux support yet (please check back later or help us to get it working for linux).

OIIO will need to be built from source since pre-built wheels are not yet available. See this issue.

macOS

  1. Make sure you have Python 3.8+ installed on your system.
  2. Navigate to the root folder and in your terminal, run python3 build.py. This will install all of the neccesary libraries and will give you the option to create a standalone executable or just run the code with Python.

Tech we're using

Python – We can effectively use Python’s strong suits (ease-of-use, portability, multitude of packages, large community, etc) and get the performance required by relying on lower-level and performant external libraries to do the heavy lifting (where implementing something in Python would be a bottleneck).

We also use GLSL in addition to Python for image-editing, as applicable, via ModernGL. Other graphics rendering API suggestions are welcome!

Numpy – Numpy is the “data-exchange” format, the core image format used for the backend of Gimel Studio. It is used as “glue” to combine OIIO, GMIC, etc.

OpenImageIO – OIIO is used for image input/output and some image editing. OpenImageIO is a library for reading, writing, and processing images in a wide variety of file formats using a format-agnostic API. It is used in professional large-scale visual effects and feature film animation, and it is used ubiquitously by large VFX studios, as well as incorporated into many commercial products.

Cario – Cairo is a 2D graphics library with support for multiple output devices, including SVG, etc. We will use either Cairo or another library (suggestions welcome) for vector graphics support.

G'MIC – For additional image effects and filters (CPU-based). Mainly need to wait for the GMIC python bindings to support Windows and macOS before implementing this into Gimel Studio, but this probably won’t be implemented until after the core is stable anyway.

wxPython – Is used as the primary GUI front-end as it’s a powerful, native, cross-platform GUI toolkit based on wxWidgets.

A greatly improved node graph for Gimel Studio is currently in development via the GS Nodegraph library.

Modern, styleable widgets for Gimel Studio are currently in development via the GS WidgetKit library.

The API Scripting Language is Python (with the option to use a GLSL shader).

Comments
  • Test and make fixes for MacOs

    Test and make fixes for MacOs

    Just as simple as that: just build and test on a MacOs system to see what needs to be fixed, etc. The current developers do not have access to a Mac so we need someone else to do this.

    good first issue macos python 
    opened by Correct-Syntax 30
  • Wanted to share a tip for Linux and OpenImageIO installation

    Wanted to share a tip for Linux and OpenImageIO installation

    Hey there, I just wanted to share with folks who might be having an issue getting OpenImageIO built / installed on linux. If you simply install the Linux version of Homebrew (Linuxbrew), you can install OIIO using brew. It takes a bit (took about 10 minutes) but it will get the job done. :+1:

    Thanks, -MH

    opened by MostHated 22
  • Preferences/Configuration Dialog

    Preferences/Configuration Dialog

    Settings/tabs I am thinking we are going to include in the dialog, so far:

    • [ ] Node wire curvature (e.g: 0 is straight, 8 is curved, etc)
    • [ ] Maybe some settings for enabling/disabling node cache as it may not always be needed/wanted
    • [ ] Node Manager (add/remove enable/disable available nodes)
    • [ ] Enable/disable "experimental" features
    • [ ] Toggle showing image thumbnails on nodes by default
    • [ ] Fonts path (default could be the system font folder)
    • [ ] Default output folder (default could be the home folder of the users computer)
    • [ ] Whether to position the Add Node menu based on the cursor location or just have it static (placed at the bottom corner)
    • [ ] Toggle showing the statusbar by default
    good first issue ui 
    opened by Correct-Syntax 21
  • Implement GLSL shader support for image manipulation (GPU image processing)

    Implement GLSL shader support for image manipulation (GPU image processing)

    This is a very difficult, work-in-progress PR to implement GLSL shader support (and thus GPU image processing) in the node API. It is currently demonstrable via the Opacity and Alpha Over Node, so feel free to test it out. 😃

    There are a bunch of things to be worked out before merging this PR:

    • [x] Implement ability to have multiple image inputs into the shader. Currently, you can only pass a single image into the shader. This works for nodes like Opacity, but the ability to pass in multiple images is needed in order to implement nodes like Mix, etc.
    • [x] Figure out loading GLSL from a file rather than hardcoding it in the python file.
    • [x] Work on code organization. (e.g: what is the best place for the GLSLRenderer class?)
    • [x] Refine the API (Passing in props to the shader could be easier, I think. Though, we don't want too much overhead.)
    • [x] Make sure to call Release on application quit.
    • ~~When two nodes in a row are using GLSL shaders, it would be nice to keep the data on the GPU to reduce overhead. This could be achieved with the Swap method, but details need to be worked out.~~ Not in this PR
    • ~~Implement 16-bit support via (uint16). Currently, only has 8-bit (uint8) support.~~ Not in this PR

    At the moment, this uses ModernGL to give us access to an OpenGL 3.3+ context. Maybe other libraries would be better?

    I am open to your critiques and thoughts on possible solutions @iwoithe, @JohJakob and others...

    This will close #27

    opened by Correct-Syntax 12
  • Running in a fresh VM, GimelStudio was able to create it's config folder, but not the config file.

    Running in a fresh VM, GimelStudio was able to create it's config folder, but not the config file.

    Describe the bug When I was doing testing in the fresh VM, after building and attempting to run the application for the first time, it seems it was able to create ~/.gimelstudio/ but it was not able to create the config file itself.

    Terminal output
    10075 INFO: Removing dir /home/mosthated/dev/github/GimelStudio/dist/GimelStudio
    10135 INFO: Building COLLECT COLLECT-00.toc
    10446 INFO: Building COLLECT COLLECT-00.toc completed successfully.
    Build complete. Run GimelStudio now? y/n y
    [email protected]:~/dev/github/GimelStudio$ [INFO] Registered core nodes
    [INFO] Registered custom nodes
    Traceback (most recent call last):
      File "main.py", line 67, in OnInit
    AttributeError: 'NoneType' object has no attribute 'upper'
    OnInit returned false, exiting...
    
    

    I tried it a second time, starting it directly instead of letting the build script start it, just in case that has anything to do with it, but it had the same results.

    Terminal output - second try
    [email protected]:~/dev/github/GimelStudio/dist/GimelStudio$ ./GimelStudio 
    [INFO] Registered core nodes
    [INFO] Registered custom nodes
    Traceback (most recent call last):
      File "main.py", line 67, in OnInit
    AttributeError: 'NoneType' object has no attribute 'upper'
    OnInit returned false, exiting...
    
    

    Once I manually created the config file by just copying it from my desktop into the VM's ~/.gimelstudio/pr1-config.json, it fired up just fine.

    I didn't have this issue with my desktop. Upon first run, it created the folder and config file. The only real difference between the environments is my desktop was using pyenv to create the build and not the system install of py3, like the VM. I am wondering if since pyenv is installed and ran from $HOME/.pyenv/bin/, it might have something to do with it, but I feel like the built application, after the fact, it would not matter?

    To Reproduce Steps to reproduce the behavior: From a fresh VM, navigate to dist/GimelStudio and execute the application via: ./GimelStudio If you create a config manually in ~/.gimelstudio/pr1-config.json, then start it again, it works. If you then remove/rename the config, ex. pr1-config.json.bak and try to start it again, it no longer works.

    Expected behavior A clear and concise description of what you expected to happen.

    Screenshots If applicable, add screenshots to help explain your problem.

    Desktop (please complete the following information): Issue does occur on:

    VM with issue
    python3 -V : Python 3.9.5
    which python3: /usr/bin/python3
    
    OS: Pop!_OS 21.04 x86_64 
    Host: KVM/QEMU (Standard PC (Q35 + ICH9, 2009) pc-q35-5.2) 
    Kernel: 5.15.5-76051505-generic 
    Uptime: 39 mins 
    Packages: 1910 (dpkg) 
    Shell: bash 5.1.4 
    Resolution: 1504x729 
    DE: GNOME 3.38.4 
    WM: Mutter 
    WM Theme: Pop 
    Theme: Pop-dark [GTK2/3] 
    Icons: Pop [GTK2/3] 
    Terminal: gnome-terminal 
    CPU: AMD EPYC-Rome (24) @ 3.493GHz 
    GPU: 00:01.0 Red Hat, Inc. QXL paravirtual graphic card 
    Memory: 1439MiB / 15620MiB 
    
    

    Issue does not occur on:

    Desktop system without issue
    pyenv 2.2.1
    pyenv python version: python3.9.9
    whereis pyenv  - /home/mosthated/.pyenv/bin/pyenv
    
    OS: Pop!_OS 21.04 x86_64
    Host: X570 AORUS ELITE -CF
    Kernel: 5.13.0-7620-generic
    Uptime: 6 days, 21 hours, 10 mins
    Packages: 3559 (dpkg), 171 (brew), 63 (flatpak), 13 (snap)
    Shell: zsh 5.8
    Resolution: 1920x1080, 2560x1080, 1920x1080
    DE: GNOME 3.38.4
    WM: Mutter
    WM Theme: Pop
    Theme: Materia-dark-compact [GTK2/3]
    Icons: Flatery-Orange-Dark [GTK2/3]
    Terminal: alacritty
    CPU: AMD Ryzen 9 3950X (32) @ 3.500GHz
    GPU: NVIDIA GeForce RTX 2070
    Memory: 44962MiB / 64250MiB
    
    

    Additional context I am going to install pyenv in the VM and then build with that and see if there is any sort of difference in behavior with the final application, I would not think there would be, but I guess that is what testing is all about.

    bug 
    opened by instance-id 9
  • Initial implementation of multi node outputs + Property based nodes

    Initial implementation of multi node outputs + Property based nodes

    Description

    Rather raw implementation of multi-outputs for nodes and the switch to using properties for node values and connections (vs. the previous properties and parameters setup). A ton of breaking changes. This PR also updates all of the current nodes to be either fully or somewhat compatible with the changes. Some of the code is a mess and there are many things that need to be added, but in order to not make this PR huge I've cut it short to the bare minimum implementation.

    Known things this PR breaks:

    • Project file IO
    • Node caching

    Related issues

    Systems Tested On

    Windows 10

    Checklist

    • [x] I signed the CLA
    • [x] There are no unnecessary or out-of-scope changes in this PR
    • [x] Gimel Studio runs successfully on the above system(s) with the changes in this PR
    • [x] The changes in this PR follow the style guides
    opened by Correct-Syntax 8
  • Add the ColorProp class to property.py

    Add the ColorProp class to property.py

    Add the ColorProp class to property.py

    Issue #93 (Implement node color property)

    Systems Tested On: Windows 10

    Checklist

    • [x] I signed the CLA
    • [x] There are no unnecessary or out-of-scope changes in this PR
    • [x] Gimel Studio runs successfully on the above system(s) with the changes in this PR
    • [x] The changes in this PR follow the style guides
    opened by yonMaor 7
  • Build process update for Linux

    Build process update for Linux

    Description

    Update to build process for Linux systems

    Related issues

    https://github.com/GimelStudio/GimelStudio/issues/118

    Systems Tested On

    Pop_OS 21.04

    Checklist

    • [x] I signed the CLA
    • [x] There are no unnecessary or out-of-scope changes in this PR
    • [x] Gimel Studio runs successfully on the above system(s) with the changes in this PR
    • [x] The changes in this PR follow the style guides
    opened by instance-id 6
  • Add the preferences dialog

    Add the preferences dialog

    Closes https://github.com/GimelStudio/GimelStudio/issues/2

    Todo

    This PR is marked as a draft as there is still quite a bit of work to do. I have added a (rough) to do list below.

    • [x] Make a final decision on the name (out of Preferences, Settings, or Options)

    • [x] Add an accent to the currently selected button

    • [x] Add the preferences themselves

    • [ ] ~Make the widgets expand to fill the whole notebook~ Not this PR

    When merged, this PR will not include

    • The "special" pages (add-ons, nodes, and templates)
    • Reset settings to defaults
    • Search/filter settings

    Current Progress

    Screenshot

    opened by iwoithe 6
  • Proposal: Use user-friendly labels for toggles

    Proposal: Use user-friendly labels for toggles

    Toggles like “Toggle Status Bar” should have a different label based on their state to better indicate what they will do when clicked. For the status bar, this could be “Show Status Bar” and “Hide Status Bar” or it could be replaced with a checkbox toggle like “Auto Render”.

    This would also make translations in certain languages (like German) easier because they do not have a convenient term like “toggle” (in German, the only fitting translation is “umschalten”, but it is a bit ambiguous). The same would apply to the help texts.

    feature good first issue 
    opened by JohJakob 4
  • Proposal: Rename “User Preferences” to “Preferences…”

    Proposal: Rename “User Preferences” to “Preferences…”

    There is no real difference between user preferences and settings in Gimel Studio. It would make sense to simplify the term “User Preferences” and just call it “Preferences”. This would also shorten the term in German from “Benutzereinstellungen” to “Einstellungen” which is more desirable.

    I would also append an ellipsis () to the menu item to let the user know that the action requires more actions/opens a dialogue. Both macOS and Blender use “Preferences…”.

    feature 
    opened by JohJakob 4
  • Use custom made icons for Gimel Studio

    Use custom made icons for Gimel Studio

    Currently Bootstrap icons are being used for GS 1. At some point it would be nice to switch to a custom icon set. Also comes from the point that there more icons will need to be made anyway as Bootstrap icons won't always have a suitable icon.

    Style

    Lined, rounded style icons

    Ideas:

    Duo-tone icons

    design ui 
    opened by iwoithe 0
  • The (hopefully) final re-write of Gimel Studio for a while

    The (hopefully) final re-write of Gimel Studio for a while

    Description

    The next re-write of Gimel Studio. More details to come soon.

    Current Progress

    As of writing, I am still working on the base of the project which will probably take a few months to complete. Note that there won't be much to see during this period.

    You can see the issues for this re-write here.

    Screenshots

    image

    image

    Related issues

    N/A

    Systems Tested On

    • Windows 10
    • Linux (Slackware/XFCE 4)

    Checklist

    • [x] I signed the CLA
    • [x] There are no unnecessary or out-of-scope changes in this PR
    • [x] Gimel Studio runs successfully on the above system(s) with the changes in this PR
    • [x] The changes in this PR follow the style guides

    Notes/Other Information

    • While correct on Linux, the icons are wrong on Windows. Yet to investigate.
    design ui core blocker node high priority 
    opened by iwoithe 0
  • Use OpenCV as a fallback for OpenImageIO, file I/O

    Use OpenCV as a fallback for OpenImageIO, file I/O

    Currently, we do not have pre-built python wheels for OpenImageIO. OpenImageIO is only used for image I/O so it is not necessarily a hard dependency. OpenCV doesn't provide all of the same support for the formats OIIO does, but that is the tradeoff. :/

    This issue should implement cv2 (which is already a dependency) as a fallback for image Input and output when OIIO is not installed. It should also alert the user that the image import and export may be limited because of using cv2 rather than OIIO.

    feature good first issue core python high priority ready 
    opened by Correct-Syntax 0
  • Add node reload

    Add node reload

    Currently, you have to restart Gimel Studio every time you make a change to a node. Add the ability to reload and refresh the nodes in Gimel Studio without restarting. Take a look at the src/GimelStudio/node_importer for an idea how they are loaded in on application start.

    feature ui core python node medium priority 
    opened by Correct-Syntax 0
Releases(v0.6.0-alpha-2)
  • v0.6.0-alpha-2(Jan 10, 2022)

    Welcome to the second pre-release of the v0.6.x series of Gimel Studio!

    This pre-release has some more of the basic functionality implemented and is mainly meant as a test version.

    It is important to note that this is a pre-release and thus is by no means feature complete (thus this is not the MVP version). There are also some known issues, so just know that many things will change from what is currently here.

    Let us know any feedback you have! Thanks.

    (Only a Windows binary is provided for this release. Enjoy. 😃)

    Source code(tar.gz)
    Source code(zip)
    GimelStudio-v0.6.0-alpha-pre-release-2.zip(69.44 MB)
  • v0.6.0-alpha-1(Nov 25, 2021)

    Welcome to the first pre-release of the v0.6.x series of Gimel Studio!

    This pre-release has some of the basic functionality implemented and is mainly meant as a test version.

    It is important to note that this is a pre-release and thus is by no means feature complete (thus this is not the MVP version). There are also some known issues, so just know that many things will change from what is currently here.

    Let us know any feedback you have! Thanks.

    (Only a Windows binary is provided for this release. Enjoy. 😃)

    Source code(tar.gz)
    Source code(zip)
    GimelStudio-v0.6.0-alpha-pre-release-1.zip(67.77 MB)
Owner
Gimel Studio
Non-destructive, node-based 2D image graphics editor
Gimel Studio
A simple Streamlit Component to compare images in Streamlit apps. It integrates Knightlab's JuxtaposeJS

streamlit-image-juxtapose A simple Streamlit Component to compare images in Streamlit apps using Knightlab's JuxtaposeJS. The images are saved to the

Robin 30 Dec 31, 2022
Visage Differentiation is a GUI application for outlining and labeling the visages in an image.

Visage Differentiation Visage Differentiation is a GUI application for outlining and labeling the visages in an image. The main functionality is provi

Grant Randa 0 Jan 13, 2022
Nutrify - take a photo of food and learn about it

Nutrify - take a photo of food and learn about it Work in progress. To make this a thing, we're going to need lots of food images... Start uploading y

Daniel Bourke 93 Dec 30, 2022
A scalable implementation of WobblyStitcher for 3D microscopy images

WobblyStitcher Introduction A scalable implementation of WobblyStitcher Dependencies $ python -m pip install numpy scikit-image Visualization ImageJ

CSE Lab, ETH Zurich 7 Jul 25, 2022
CadQuery is an intuitive, easy-to-use Python module for building parametric 3D CAD models.

A python parametric CAD scripting framework based on OCCT

1.9k Dec 30, 2022
Xmas-Tree-GIF-Tool - Convert any given animated gif file into an animation in GIFT CSV format

This repo is made to participate in Matt Parker's XmasTree 2021 event. Convert a

Aven Zitzelberger 2 Dec 30, 2021
将位图转为彩色矢量 svg 图片

一个将位图描摹为彩色矢量 svg 图片的程序,是一个命令行工具,使用 Python 脚本实现,运行环境 Python3.8+。 ✨ 效果 以一个字帖图片为例,这是 png 格式的位图(370KB): 这是颜

Haujet Zhao 104 Dec 30, 2022
Short piece of code to create a rainbow gif of gradual contours from two shapefiles

rainbow-elevation-gif Short piece of code to create a rainbow gif of gradual con

Jess Roberts 6 Jan 17, 2022
Image Reading, Metadata Conversion, and Image Writing for Microscopy Images in Python

AICSImageIO Image Reading, Metadata Conversion, and Image Writing for Microscopy Images in Pure Python Features Supports reading metadata and imaging

Allen Institute for Cell Science - Modeling 137 Dec 14, 2022
Image Processing HighPass Filter With Python

Image_Processing_HighPassFilter High Pass Filter take the high frequency and ignore the low frequency High Pass Filter can be use to sharpening an ima

Felix Pratamasan 1 Dec 27, 2021
粉專/IG圖文加工器

粉專/IG圖文加工器 介紹 給PS智障(ex:我)使用,用於產生圖文 腳本省去每次重複步驟 可載入圖片(方形,請先處理過,歡迎PR) 圖片簡易套用濾鏡 可將圖片切片 要求 Python 版本 3.9 安裝 安裝最新 python pip3 install -r requirement.txt 效果

Louis Tang 7 Aug 10, 2022
An agnostic Canvas API for the browser-less and insane

Apollo An agnostic Canvas API for the browser-less and mildly insane. Project Apollo is a Pythonic re-imagining of HTML Canvas element implementati

1 Jan 13, 2022
Leshycam - Generate Inscryption styled portrait sprites from any image

Leshy's Camera Generate Inscryption styled portrait sprites from any image. Setu

3 Sep 27, 2022
Create a random fluent image based on multiple colors.

FluentGenerator Create a random fluent image based on multiple colors. Navigation Example Install Update Usage In Python console FluentGenerator Fluen

1 Feb 02, 2022
Command line utility for converting images to seamless tiles

img2texture Command line utility for converting images to seamless tiles. The resulting tiles can be used as textures in games, compositing and 3D mod

Artёm IG 24 Dec 26, 2022
ModernGL is a python wrapper over OpenGL 3.3+ core

ModernGL is a python wrapper over OpenGL 3.3+ core that simplifies the creation of simple graphics applications like scientific simulations, games or user interface

ModernGL 1.4k Jan 01, 2023
Python script to generate vector graphics of an oriented lattice unit cell

unitcell Python script to generate vector graphics of an oriented lattice unit cell Examples unitcell --type hexagonal --eulers 12 23 34 --axes --crys

Philip Eisenlohr 2 Dec 10, 2021
python binding for libvips using cffi

README PyPI package: https://pypi.python.org/pypi/pyvips conda package: https://anaconda.org/conda-forge/pyvips We have formatted docs online here: ht

libvips 467 Dec 30, 2022
Django helper application to easily and non-destructively crop arbitrarily large images in admin and frontend.

django-image-cropping django-image-cropping is an app for cropping uploaded images via Django's admin backend using Jcrop. Screenshot: django-image-cr

Jonas und der Wolf GmbH 546 Jan 03, 2023
QR Code Generator

In this project, we'll be using some libraries to instantly generate authentic QR Codes and export them in various formats

Hassan Shahzad 3 Jun 02, 2022