Un photoshop Like !

Programmation d'applications complexes
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Un photoshop Like !

Message par Thyphoon »

Apparemment suite au sujet de LSI avec son superbe sélecteur de couleur. Plusieurs personnes seraient intéressé part un travaille en équipe pour essayer de développé un Photoshop Like.

J'avoue ne pas être habituer au travail en équipe mais je me dis que c'est une bonne expérience. Tout conseille est donc le bienvenu.

Comme il faut bien commencer part quelques choses, et que c'est un projet qui me travaille depuis quelques temps, voici le fruit de ma réflexion. N'hésitez pas a réagir.
Avant de se mettre a coder dans tout les sens, je pense qu'il faut se mettre d'accord sur un certain nombre de chose avant d'aller plus loin. Attention ce n'est qu'une proposition, loin de moi l'idée d'imposer quoi que ce soit !
Je crois qu'il y a 3 points important dont tout le monde aura besoin
  • Définir la structure des informations propre aux calques et a l'image
    Il faut pouvoir ouvrir plusieurs Images, et chaque images être composé de Layer avec différentes infos
    voici une proposition de structure si quelqu'un a mieux qu'il n'hesite pas

    Code : Tout sélectionner

    Structure Layer
      Active.b          ; #True ou #False si ce calque est affiché ou pas
      Image.l           ; Image originale
      Opacity.b         ; Transparence global de l'image : ConstAlpha de la function DrawAlphaImage()
      BlendingMode.l    ; Je sais pas si c'est gérable il y a un exemple d'utilisation sur le forum Anglais
      FusionMaskImage.l ; Image comportant le Mask de fusion si il y a !
      ;http://www.purebasic.fr/english/viewtopic.php?f=13&t=36311
    EndStructure
    
    #Max_Layer=255
    Structure Image
      FileName.s        ;Nom de l'image
      RenderImage.l     ;Image de rendu des layers
      WorkImage.l       ; Image redimensionné et affiché !
      Depth.b           ;Profondeur de l'image (peut être n'en a t'on pas besoin ImageDepth() suffit
      ImageSelection.l  ;Image comportant le Masque de Selection
      Layer.l           ;Numero du layer selectionné
      Layers.Layer[#Max_Layer] ;Les informations sur les layers mais je ne sais pas si c'est la bonne façon de faire
    EndStructure
    #Max_Image=20
    Global Dim Workbench.Image(#Max_Image)
    
    Procedure RenderLayers(Imag)
    EndProcedure
    
    Qu'en pensez vous ?
  • Définir les functions de dessin qui seront utile pour chaque outil
    La plus part des outils devront dessiné en fonction d'une couleur, d'un dégradé, ou d'un motif
    peut être écrire une procédure générale qui remplacerait la commande plot() en fonction de ce qu'on utilise pour dessiner

    Code : Tout sélectionner

    ;Variable général aux outils (a voir si ces infos devraient pas être propre a chaque outil)
    Structure ToolsInfo
      FrontColor.l      ;Couleur de premier plan
      BackgroundColor.l ;Couleur d'arrière plan
      ToolRenderMode.l  ;Mode de rendu des outils voir enumeration si dessous Couleur/Gradiant/Pattern
    EndStructure
    
    Global ToolsInfo.ToolsInfo
    
    ;Mode de rendu d'un outil
    Enumeration
      #ModeCouleur    ;On utilise les couleur de premier et arrière plan
      #ModeGradiant   ;On utilise un dégradé
      #ModePattern    ;On utilise un motif
    EndEnumeration
    
    Procedure RenderPlot(x.l,y.l,Color.l)
     Select ToolsInfo\ToolRenderMode
      Case #ModeCouleur
        
      Case #ModeGradiant
        
      Case #ModePattern
        
     EndSelect
    EndProcedure
    
  • Définir les functions de Undo Redo (vu que chaque outil devra les utiliser)
    je ne sais pas trop quel est la meilleur façon de faire ça ...
    Je me demande si ça ne serait pas bon de faire un fichier Temporaire style base de donnée Sqlite
    et chaque outil sauvegarde les modifications faites dans la base de donnée (Blob) ?
    ce qui permettrait de revenir ou on veut en arrière... Si quelqu'un a une idée ...
Enfin voilà ! je pense que tout le code doit être en EnableExplicit et si possible cross-plaforme !si pour x raison vous utiliser un API (mais a mon avis il faut eviter) penser a mettre un CompilerIf #OS et une alternative pour les autres platformes (même si plus lente dans un premier temps)
Et je propose que pour les variables on les nomes en Anglais chaque mot collé, mais avec une majuscule au debut de chaque mot. Idem pour les procedures
Exemple:
MaVariable.l
RenderLayer()
FillPattern()

Voilà j'attends vos remarques, idées, suggestion, proposition etc.. :P
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Un photoshop Like !

Message par djes »

Ce qui fait la grande force de photoshop et qui manque cruellement à tous ses "concurrents" (qui à mon avis ne lui arrivent pas à la cheville), est sa gestion des images de grandes dimensions (quand je dis grandes, j'entends TRES GRANDES). On voit qu'il travaille par blocs, avec le disque dur comme mémoire temporaire. C'est quelque chose qu'il faut prendre en considération dès le départ, car aucune API ne permet de travailler sereinement avec des images pareilles, et les limitations arriveront vite.

Voilà, comme on dit ailleurs, "mes deux eurocents" ;)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Un photoshop Like !

Message par Anonyme2 »

Je ne sais pas si tu vas avoir beaucoup de clients car c'est un travail titanesque, il va falloir que tu lises tout sur chaque format d'image que tu souhaites gérer (pour le png, la doc est déjà longue, j'ai travaillé un peu le sujet).

Il faut commencer par un format, écrire le jeu de fonctions qui va bien et seulement après, voir si c'est possible pour d'autres formats sans avoir un tube d'aspirine sur le clavier :D

Il existe en C des fonctions pour les png, jpeg etc. qu'il serait possible d'utiliser en PB, il faudrais faire des libs depuis le C mais je ne sais pas faire.

La programmation orienté objet serait plus adapté à ce projet.

Bon courage.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: Un photoshop Like !

Message par Octavius »

Pour les informations sur les formats, Photoshop utilise des fichiers séparés (format 8BI). De cette manière il est possible de rajouter de nouveaux formats de fichier gérables par Photoshop simplement en collant les plugins nécessaires dans le dossier approprié. Il est peut-être possible d'utiliser ces fichiers 8BI directement, ou au moins d'en copier le principe.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Un photoshop Like !

Message par Thyphoon »

Octavius a écrit :Pour les informations sur les formats, Photoshop utilise des fichiers séparés (format 8BI). De cette manière il est possible de rajouter de nouveaux formats de fichier gérables par Photoshop simplement en collant les plugins nécessaires dans le dossier approprié. Il est peut-être possible d'utiliser ces fichiers 8BI directement, ou au moins d'en copier le principe.
Oui c'est ce que je pensais ... un système de plugin pour l'import export des fichiers c'est tout a fait faisable... et on peut aussi se reposer sur une librairie optionel genre imagemagic
Denis a écrit :Je ne sais pas si tu vas avoir beaucoup de clients car c'est un travail titanesque, il va falloir que tu lises tout sur chaque format d'image que tu souhaites gérer (pour le png, la doc est déjà longue, j'ai travaillé un peu le sujet).

Il faut commencer par un format, écrire le jeu de fonctions qui va bien et seulement après, voir si c'est possible pour d'autres formats sans avoir un tube d'aspirine sur le clavier :D

Il existe en C des fonctions pour les png, jpeg etc. qu'il serait possible d'utiliser en PB, il faudrais faire des libs depuis le C mais je ne sais pas faire.

La programmation orienté objet serait plus adapté à ce projet.

Bon courage.
Merci pour tes conseilles Denis !

Je pense pas que ce soit titanesque comme tu le dis. Il y a du boulot c'est certain, mais il faut avancer étape part étape ! Et moi ce qui m'a donné l'idée c'est que toutes les fonctions importante on déjà été posté sur les forums ....Donc pas mal part LSI !

Sinon je ne vois pas pourquoi se prendre la tête a rentrer dans le format JPEG/PNG a ce niveau là PB nous offre tout ce qu'il faut ! En interne le programme travaille avec une image RAW.
Apres pour la lecture et l'ecriture de différent format , PB nous offre quelques encoder et decoder, on en trouve d'autre sur le forum anglais, et il existe des libraires (imagemagic) qui font ça tres bien !
Je suis d'accord que la programmation objet serait plus adapté ...mais je pense que c'est faisable si le code est bien organisé !J'ai un peu d'expérience ayant réalisé un photoshop like il y a quelques année sur Amiga en Blitz. Je n'ai eu aucun problème a gerer des calques, et différents format d'entrée sortie. Mais le système de dessin restait basique , cercle, point, remplir, etc..... Aujourd'hui mon niveau de programmation est bien meilleur je pense savoir faire ce que je ne savais pas quoi faire avant ...
Et vais essayer en tout cas !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Un photoshop Like !

Message par Anonyme2 »

Octavius a écrit :Pour les informations sur les formats, Photoshop utilise des fichiers séparés (format 8BI). De cette manière il est possible de rajouter de nouveaux formats de fichier gérables par Photoshop simplement en collant les plugins nécessaires dans le dossier approprié. Il est peut-être possible d'utiliser ces fichiers 8BI directement, ou au moins d'en copier le principe.
Je pense qu'il doit s'agir de fichier qui converti le format (png, tiff) etc vers un encodage propre à photoshop, ce qui permet de gérer tous les formats à partir de leur format interne.

J'ai utilisé cette méthode dans mon outils de gestion des icônes, les différents formats sont convertis dans un format interne et ensuite, j'ai écrit des fonctions qui crée tel ou tel type à partir de mon format interne, c'est peut-être plus long dans certains cas mais ça a l'avantage d'avoir une démarche cohérente.

Mais je continue à penser que cela représente un travail titanesque.

1) L'interface à faire, pas forcément le plus simple car on a beaucoup de problèmes de rafraichissement sur de grands codes.

2) La conversion de formats

3) La gestion de la mémoire, car on rencontre facilement des plantages ou des écrasements de données, voire du header de la mémoire (c'est vraiment le point critique pour avoir du code stable).

4) La gestion des erreurs, indispensable.

5) La doc, car sans doc, c'est pas facile d'utiliser un logiciel

6) qui fait quoi et qu'elles sont les règles communes de travail

et puis il y a le reste :mrgreen: , c'est-à-dire tous les imprévus..., la portabilité (32/64 bits) ...
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Un photoshop Like !

Message par Thyphoon »

Oui je vois ce que tu veux dire ! Et je suis bien d'accord avec toi !
Mais le défis me plait bien ! je sais que je n'arriverais jamais a la hauteur d'un photoshop, mais je pense que ça doit être possible de faire une application de dessin et de retouche photo qui soit pas trop mal !
Je vais me baser sur ma réflexion du premier poste et essayer de voir ce que ça donne et si c'est fonctionnel !
Je vous tient au courant !
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Un photoshop Like !

Message par Thyphoon »

J'ai pas encore eu le temps de m'y mettre ! Mais je n'arrive pas a m'empêcher d'y penser !
A mon avis le plus difficile est de dessiner dans une fenêtre proprement sens utiliser un openscreen()
Si quelqu'un a une idée sur la question je suis preneur ! :P
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Un photoshop Like !

Message par Cls »

Si je peux me permettre un conseil d'organisation : faites un petit découpage des tâches à effectuer pour arriver à un premier résultat. Dans ce genre de projet, pas la peine de faire une gestion de projet tirée à 4 épingles mais c'est toujours bien de se faire une liste de TODO. Arrivé à une vingtaine de tâches distinctes, potentiellement réalisables par une seule personne, hiérarchiser les pour savoir quelles sont celles devant être réalisées en premier, celles devant être découpées, etc.

Après ça, on a déjà une vision plus claire du projet et on arrive à anticiper certains problèmes.

Bien évidement il y a toujours des parties communes qu'il est, à mon sens, préférable de réaliser seul afin de cadrer le reste de l'équipe.

Voilou, bon courage en tout cas ;)
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: Un photoshop Like !

Message par Frenchy Pilou »

Pour donner envie de faire pareil en voici un qui fonctionne en flash!
SumoPaint et fonctionnant en ligne qui plus est, et gratoche pour ne rien gâcher 8)
Image
Est beau ce qui plaît sans concept :)
Speedy Galerie
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Un photoshop Like !

Message par Backup »

Frenchy Pilou et sa recherche efficace

le probleme , c'est qu'a chaque fois que quelqu'un va proposer de faire
tel ou tel type de prg, tu interviens avec tes recherches (fabuleuse au passage ) , mais terriblement décourageante ! ;)

pourquoi veut tu que leur motivation reste entière , si tu leur montre
qu'il existe des produits complet et gratuits !! ??

pour ma part , je pense que le projet d'un correcteur de photo
est bien du domaine du possible , si l'on ne cherche pas a concurrencer
photoshop ...

mais je ne pense pas que le travail d'une équipe comme vous l'envisagez soit possible par contre ..

je pense qu'il vaut mieux qu'une ou 2 personne soit motivé pour faire tout le squelette , et que chacun apporte sa petite pierre , sous forme de plugins ou de procedures par exemple...

c'est ce que nous avions fait pour l'éditeur de son avec Z****

car nos façon de programmé sont trop différentes, de toute façon ..

perso je ne supporte pas les codes avec les procédures au debut
c'est bete , mais c'est ce genre de détail qui fait que je bloc complet ;)

je vous souhaite bon courage :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Un photoshop Like !

Message par Le Soldat Inconnu »

Je vais proposer une idée tout aussi plaisante, et peut-être plus facile.

plutot qu'un photoshop like, on peut faire un bon éditeur d'icône :) , bon c'est plus pour Windows.

Format ICO (je peux déjà donner l'algo de conversion d'une image PNG vers une Icône 24Bit et 32bits XP)
Taille limitée des images
Pas besoin d'effets énorme, ça reste assez simple.

Si le projet est bien gérer et bien organiser, il sera ensuite assez simple d'intégrer de nouveaux format d'entrée et de sortie, d'ajouter de nouveau effet pour le transformer un Photoshop like.

On aurait ainsi un éditeur d'images compatible format ICO, ce qui à mon avis n'existe pas vraiment sur le marché. Comme ça, en plus, on innove.

Après, pour les formats, le BMP, Jpeg et PNG, pour moi, ca me suffit en format d'entrée (du moins pour commencer). Même si avoir des plugin pour les types de fichiers serait sympathique. Mais cela peut s'intégrer aisément à partir du moment ou le format de fichier est gérer par une dll propre pour chaque type.

A vous de voir, je n'ai malheureusement pas le temps de m'y investir. Je de gros projets en cours que je n'arrive pas à terminer faute de temps
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: Un photoshop Like !

Message par Frenchy Pilou »

Mais non, ça ne décourage pas au contraire, ça motive de voir que d'autres l'on déjà fait!
Celui-là, il s'est pas dégonflé, il a carrément fait un mix de Toshop et Painter Classic! Artweaver 8O
Il faut voir tout cela comme "des exercices d'école", des "tours de force" et ça donne un but de programmation ;)

PS AH tiens, il a même le culot de vendre son programme maintenant! (25 $) :lol:
Il reste une version free :D
Comme quoi si en plus en s'amusant ça rapporte à la fin, pourquoi se priver :mrgreen:
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Un photoshop Like !

Message par venom »

Bonjour,

Je ne vais pas apporté grand chose a ce projet qui pour moi a l'air sympathique, mais je manque cruellement de temps et de niveau aussi pour sa.
néanmoins, comme dit Dobro, un logiciel avec un système de plugins ça peut être pas mal comme sa tous le monde peut en effet programmer son petit utilitaire qui ferais avancer et evoluer sans cesse le logiciel.

si non je vais suivre ce projet qui peut etre une bonne chose. Bon courage.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Un photoshop Like !

Message par Thyphoon »

Merci a tous pour votre intérêt !

Je retiens vos idées ...
L'idée du Soldat Inconnu de faire un éditeur d'icon me plait bien... en vérité c'est la même chose avec quelques options en plus (bloquer la résolution...et gestion du format Ico). L'idée de plugin est très bonne... J'y avait déjà pensé !
J'avais dans l'idée de faire un jeu de procédure simple qui permettrait a n'importe qui de réalisé un outil sous forme d'include ou de librairie externe...

Je comprends qu'on a tous plein de projets en cour (moi le premier), et qu'on a pas envie de se lancer/s'engager dans un gros projet.
Mais si vous voulez aidé sans avoir vous lancer dans un gros truc...si dessous je vous propose un petit bout de code a modifier pour dessiner dans une fenêtre si vous avez une meilleur idée, ça ne vous prendra pas beaucoup de temps ... Et si ça marche je m'occuperais de l'intégré dans le code de l'application

Voici les grosses étapes a mon avis du projets
  • L'interface Graphique
    ça parait simple sur le coup,mais il y a la une vrai difficulté de dessiner a main levé dans différente fenêtre en essayant de ne pas utiliser l'openscreen...

    Voilà ce que j'ai fait...helas ça ne marche que pour Windows et Linux (si un MacOs passe dans le croin et veut essayé d'améliorer la function WindowMouseButton(Wnd, ButtonNr) )
    Si vous avez une meilleur solution n'hésitez pas (moi j'ai pas réussi a n'utiliser que les functions propre a PB)

    Code : Tout sélectionner

    Procedure WindowMouseButton(Wnd, ButtonNr)
      CompilerIf #PB_Compiler_OS = #PB_OS_Linux
      ;Linux Version
    
      Protected gdkWnd.l, x.l, y.l, mask.l
    
      If Wnd
        *Window.GTKWindow = Wnd
        gdkWnd = *Window\bin\child\window
        gdk_window_get_pointer_(gdkWnd, @x, @y, @mask)
       
        Select ButtonNr
          Case 0
            If (mask & #GDK_BUTTON1_MASK)
              ProcedureReturn 1
            EndIf
          Case 1
            If (mask & #GDK_BUTTON3_MASK)
              ProcedureReturn 1
            EndIf
          Case 2
            If (mask & #GDK_BUTTON2_MASK)
              ProcedureReturn 1
            EndIf
        EndSelect
      EndIf
    
      CompilerElse
      ;Windows Version
    
      If Wnd And GetForegroundWindow_() = Wnd
        Select ButtonNr
          Case 0
            If GetAsyncKeyState_(#VK_LBUTTON) > 0
              ProcedureReturn 1
            EndIf
          Case 1
            If GetAsyncKeyState_(#VK_RBUTTON) > 0
              ProcedureReturn 1
            EndIf
          Case 2
            If GetAsyncKeyState_(#VK_MBUTTON) > 0
              ProcedureReturn 1
            EndIf
        EndSelect
      EndIf
    
      CompilerEndIf
    
      ProcedureReturn 0
    EndProcedure
    
    
    If OpenWindow(0, 0, 64, 640, 480, "Untitled 1 @ 100% (RGB/24)",#PB_Window_TitleBar|#PB_Window_WindowCentered|#PB_Window_Tool|#PB_Window_SystemMenu|#PB_Window_SizeGadget )
      CreateImage(0,640,480)
      Repeat
        Event = WaitWindowEvent()
        
        x=WindowMouseX(0)
        y=WindowMouseY(0)
        If WindowMouseButton(WindowID(0), 0)
        StartDrawing(ImageOutput(0))
          If x>0 And x<ImageWidth(0) And y>0 And y<ImageHeight(0)
            Plot(x,y,#Red)
          EndIf
        StopDrawing()
        Endif
        StartDrawing(WindowOutput(0))
          DrawImage(ImageID(0),0,0)
        StopDrawing()
        If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
          Quit = 1
        EndIf
    
      Until Quit = 1
      
    EndIf
    
    End
    
    
  • Le moteur de rendu des layers
    J'ai un moteur qui fonctionne actuellement ... Mais le moteur dépendra un peu de la façon dont on arrive a dessiner dans une fenêtre voir si dessus.
    Mais je pense qu'il y a moyen de largement optimisé le moteur de rendu. au le d'afficher tout les layers a chaque rafraichissement de l'image, il y a moyen de faire un rendu d'une preview de l'image sur le quel on travail, et faire un rendu dans plusieurs thread en arrière plan. Il y a aussi possibilité d'utilisé un buffer pour aplatir les layers qui ne sont pas utilisé, ainsi il n'ya plus qu'a affiché Le Buffer des layers du dessus, Le Layer sur lequel on travail, Le Buffer des layers du dessous.
    J'ai déjà écrit quelques trucs pour faire des tests ça m'a l'air faisable.
  • Function Undo/Redo
    Si j'y ai un peu réfléchis j'ai pas encore d'idée bien arrêté ! Comment pouvoir retourner en arrière ou en avant a volonté.
    La seul solution que j'ai trouvé c'est un (énorme fichier temporaire) ou je sauvegarde tout les calques a chaque modification... Si quelqu'un a une idée là dessus qu'il n'hésite pas...
  • Les outils
    Pour moi les outils c'est intégré a l'application, l'idée c'est de fournir un fichier code basic avec tout ce qu'il faut pour faire un outil... Et pour rajouter l'outil il suffit de rajouter l'include du fichier ...
    Sachant qu'un outil doit être capable de lire et écrire dans un calque de gérer le undo. De rajouter quelques choses dans les menus, d'utiliser la fenêtre option.
  • Les filtres
    là il faut un système simple pour faire un plugin
    j'ai l'idée de faire fonctionner Les filtres dans un Thread autonome (Si quelques choses est un peu long en rendu ça bloque le calque sur lequel on travail mais pas le reste) En lui passant une Structure contenant les adresses des fonctions nécessaire pour travailler
    exemple a main levé:

    Code : Tout sélectionner

    Structure PluginProcedure
    *ReadLayerPixel
    *WriteLayerPixel
    *Undo
    EndStructure
    
    PluginProcedure.PluginProcedure
    PluginProcedure\ReadLayerPixel=@ReadLayerPixel()
    
    CallPlugin(@PluginProcedure)
    
voilà ! A plus
Répondre