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
    mosthated@pop-os:~/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
    mosthated@pop-os:~/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
An open source image editor which can manipulate an image in many ways!

Image Editor - An open source image editor which can manipulate an image in many ways! If you need any more modes in repo or I

TroJanzHEX 44 Nov 17, 2022
A python based library to help you create unique generative images based on Rarity for your next NFT Project

Generative-NFT Generate Unique Images based on Rarity A python based library to help you create unique generative images based on Rarity for your next

Kartikay Bhutani 8 Sep 21, 2022
GTK and Python based, simple multiple image editor tool

System Monitoring Center GTK3 and Python3 based, simple multiple image editor tool. Note: Development of this application is not completed yet. The ap

Hakan Dündar 1 Feb 2, 2022
display: a browser-based graphics server

display: a browser-based graphics server Installation Quick Start Usage Development A very lightweight display server for Torch. Best used as a remote

Szymon Jakubczak 205 Oct 17, 2022
cmdpxl: a totally practical command-line image editor

cmdpxl: a totally practical command-line image editor Features cmdpxl has many exciting functionalities, including Editing pixels one at a time! Savin

Jieruei Chang 475 Dec 23, 2022
DrawBot is a powerful, free application for macOS that invites you to write Python scripts to generate two-dimensional graphics

DrawBot is a powerful, free application for macOS that invites you to write Python scripts to generate two-dimensional graphics.

Frederik Berlaen 344 Jan 6, 2023
MyPaint is a simple drawing and painting program that works well with Wacom-style graphics tablets.

MyPaint A fast and dead-simple painting app for artists Features Infinite canvas Extremely configurable brushes Distraction-free fullscreen mode Exten

MyPaint 2.3k Jan 1, 2023
Turtle graphics || Python

turtle Turtle graphics || Python Rainbow (রংধনু) : Rainbow.using.Python.--.Python.Turtle.graphics.mp4 Human robot (মানব রোবট) : Draw.a.human.robot.usi

Jubair Ahmed Junjun 1 Oct 8, 2021
Python library for ascii graphics

Python library for ascii graphics

Anton 6 Oct 20, 2021
Python framework for creating and scaling up production of vector graphics assets.

Board Game Factory Contributors are welcome here! See the end of readme. This is a vector-graphics framework intended for creating and scaling up prod

Adam Volný 5 Jul 13, 2022
GIMP script to export bitmap as GRAPHICS 4 file (aka SCREEN 5)

gimpfu-msx-gr4.py GIMP script to export bitmap as GRAPHICS 4 file (aka SCREEN 5). GRAPHICS 4 specs are: 256x212 (or 256x192); 16 color palette (from 5

Pedro de Medeiros 4 Oct 17, 2022
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 to Skia Graphics Library

Skia python binding Python binding to Skia Graphics Library. Binding based on pybind11. Currently, the binding is under active development. Install Bi

Kota Yamaguchi 170 Jan 6, 2023
PyPixelArt - A keyboard-centered pixel editor

PyPixelArt - A keyboard-centered pixel editor The idea behind PyPixelArt is uniting: a cmdpxl inspired pixel image editor applied to pixel art. vim 's

Douglas 18 Nov 14, 2022
a lite weight photo editor written in python for day to day photo editing!

GNU-PhotoShop A lite weight Photo editing Program (currently CLI only) written in python3 for day to day photo editing. Disclaimer : Currently we don'

Kunal Sharma 5 May 30, 2022
Unique image & metadata generation using weighted layer collections.

nft-generator-py nft-generator-py is a python based NFT generator which programatically generates unique images using weighted layer files. The progra

Jonathan Becker 243 Dec 31, 2022
Image generation API.

Image Generator API This is an api im working on Currently its just a test project Im trying to make custom readme images with your discord account pr

Siddhesh Zantye 2 Feb 19, 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 3, 2023
Nanosensor Image Processor (NanoImgPro), a python-based image analysis tool for dopamine nanosensors

NanoImgPro Nanosensor Image Processor (NanoImgPro), a python-based image analysis tool for dopamine nanosensors NanoImgPro.py contains the main class

null 1 Mar 2, 2022