Page 1 sur 4
Un photoshop Like !
Publié : mer. 02/déc./2009 9:07
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..

Re: Un photoshop Like !
Publié : mer. 02/déc./2009 9:52
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"

Re: Un photoshop Like !
Publié : mer. 02/déc./2009 11:03
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
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.
Re: Un photoshop Like !
Publié : mer. 02/déc./2009 11:35
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.
Re: Un photoshop Like !
Publié : mer. 02/déc./2009 11:41
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
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 !
Re: Un photoshop Like !
Publié : mer. 02/déc./2009 12:45
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

, c'est-à-dire tous les imprévus..., la portabilité (32/64 bits) ...
Re: Un photoshop Like !
Publié : mer. 02/déc./2009 13:22
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 !
Re: Un photoshop Like !
Publié : mer. 02/déc./2009 16:42
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 !

Re: Un photoshop Like !
Publié : mer. 02/déc./2009 18:39
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

Re: Un photoshop Like !
Publié : mer. 02/déc./2009 19:41
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

Re: Un photoshop Like !
Publié : mer. 02/déc./2009 22:16
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

Re: Un photoshop Like !
Publié : mer. 02/déc./2009 22:35
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
Re: Un photoshop Like !
Publié : jeu. 03/déc./2009 1:24
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
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 $)
Il reste une version free
Comme quoi si en plus en s'amusant ça rapporte à la fin, pourquoi se priver

Re: Un photoshop Like !
Publié : jeu. 03/déc./2009 7:04
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.
@++
Re: Un photoshop Like !
Publié : jeu. 03/déc./2009 8:35
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