IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Free Pascal Discussion :

Cherche source pour format d'image


Sujet :

Free Pascal

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 53
    Points : 72
    Points
    72
    Par défaut Cherche source pour format d'image
    Bonjour,
    J'ai récupéré mes vieux programmes de fractales tirés du livre de R.T. Stevens.
    Ils sont écrits pour le Turbo Pascal de Borland mais ça ne devrait pas poser de problème avec Free Pascal.
    Mais ils sauvent (et rechargent) les images codées au format PCX qui est fort limité du point de vue des couleurs (16 seulement !).
    Je cherche donc un exemple me permettant de remplacer cette partie du code (création d'un fichier image en sortie et lecture en entrée) par quelque chose de plus moderne et qui donnera un bien meilleur rendu. Je n'ai pas trop de préférence sur le format, n'ayant pas de connaissances particulières dans la programmation des graphismes (on peut même dire que je n'y connais rien du tout).
    Je n'ai pas trouvé de section dédiée aux graphismes dans le forum.
    Merci d'avance pour votre aide.
    Il va de soi que j'enverrai mes sources à celles et ceux qui sont intéressés ... quand ça fonctionnera bien.
    François

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 951
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 951
    Points : 5 671
    Points
    5 671
    Par défaut
    Hoa,

    Pour les images de fractales, on sauve plutôt le résultat du calcul lui-même (qui permet ensuite de déterminer la couleur de chaque pixel), ce qui permet ensuite de modifier l'image en changeant la palette de couleurs et/ou les limites pour attribuer les couleurs sans avoir à refaire le calcul.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Une autre solution serait de profiter du passage de turbo pascal à freepascal pour changer de librairie graphique. Tu pourrais utiliser la SDL par exemple. Tu as un tuto ici. Comme ça plus de problème de gestion de format d'image tout est fait par la SDL. Dans le même genre que la SDL il y a aussi Allegro.pas.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Bon comme j'étais pas très occupé je me suis amusé à adapter un programme turbo pascal qui dessine l'ensemble de mandelbrot pour qu'il utilise la SDL.

    J'ai trouvé le programme d'origine sur cette page.

    Et voici mon adaptation pondue vite fait juste pour m'amuser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    program mandelbrot1;
    {First demo of drawing a Mandelbrot Set. This program merely
    demonstrates the basics of calculating and plotting.}
     
    uses SDL; {A unit that allows us to read single keypresses.}
     
    {Note to C programmers: the variable type "real" is equivalent
    to the C type "float".}
     
    var cx,cy: real; {Where do we want to center the brot?}
        scale: real; {This is the "zoom" factor.}
        limit: word; {Divergence check value.}
        lp: word; {Convergence check value.}
        a1,b1,a2,b2: real; {For calculating the iterations.}
        x,y: integer; {The pixel we are drawing.}
        ax,ay: real; {The actual position of (x,y) in relation to
                      the Mandelbrot set.}
     
        Screen: PSDL_Surface;
     
        Pal: array [0..255] of UInt32;
     
    { Trace un pixel sur une surface 32 bits}
    procedure SDL_PutPixel32(Surface: PSDL_Surface; X, Y: SInt16; Color: UInt32);
    var
      Offset: cardinal;
      P:      ^UInt8;
      Pixel:  ^UInt32;
    begin
      Offset := Y * Surface^.Pitch + X * 4;
      P      := Surface^.Pixels + Offset;
      Pixel  := Pointer(P);
      Pixel^ := Color;
    end;
     
    procedure InitGFX;
    var
      I: Integer;
    begin
      SDL_Init(SDL_INIT_VIDEO);
      Screen:=SDL_SetVideoMode(320, 200,32, SDL_SWSURFACE);
      if Screen = nil then
        Halt;
     
      for I:=Low(Pal) to High(Pal) do
        Pal[I]:=SDL_MapRGB(Screen^.format, Random(256), Random(256), Random(256));
     
    end;
     
    procedure EndGFX;
    begin
      SDL_FreeSurface(Screen);
      SDL_Quit;
    end;
     
    procedure PutPixel(a,b: word; c: byte);
    begin  
      SDL_PutPixel32(Screen, a, b, Pal[C]);
    end;
     
    begin
        Randomize;
     
        {Set up video mode.}
        InitGFX;
        SDL_LockSurface(Screen);
     
        {Set up initial values for drawing. Try compiling the program
        with different values here if you like!}
        cx:=0; cy:=0; scale:=0.02;
        limit:=4;
     
        {Loop through all pixels on screen. For reasons that will become
        clear, I am counting not from (0,0) but from (-160,-100).}
        for x:=-160 to 159 do
          for y:=-100 to 100 do begin
            {What is the *mathematical* value of this point?}
            ax:=cx+x*scale; ay:=cy+y*scale;
     
            {And now for the magic formula!}
            a1:=ax; b1:=ay; lp:=0;
            repeat
              {Do one iteration.}
              lp:=lp+1;
              a2:=a1*a1-b1*b1+ax;
              b2:=2*a1*b1+ay;
              {This is indeed the square of a+bi, done component-wise.}
              a1:=a2; b1:=b2;
            until (lp>255) or ((a1*a1)+(b1*b1)>limit);
            {The first condition is satisfied if we have convergence.
            The second is satisfied if we have divergence.}
     
            {Define colour and draw pixel.}
            if lp>255 then lp:=0;
            {If the point converges, it is part of the brot and we
            draw it with colour 0, or black.}
            PutPixel(x+160,y+100,lp);
          end;
     
        SDL_UnlockSurface(Screen);
     
        SDL_Flip(Screen);
     
        SDL_Delay(5000);
     
        EndGFX;
    end.
    J'ai remplacé l'attente d'une touche par une pause de 5 secondes.

    Ca doit compiler sans problème avec FreePascal. Pour l'exécution sous windows il faut installer la dll de la SDL soit dans le même dossier que le programme soit dans le dossier windows par exemple. Pour télécharger la SDL c'est par ici.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 53
    Points : 72
    Points
    72
    Par défaut Images fractales
    Citation Envoyé par droggo Voir le message
    Hoa,

    Pour les images de fractales, on sauve plutôt le résultat du calcul lui-même (qui permet ensuite de déterminer la couleur de chaque pixel), ce qui permet ensuite de modifier l'image en changeant la palette de couleurs et/ou les limites pour attribuer les couleurs sans avoir à refaire le calcul.
    Ben, oui, je sais. Mais je n'ai pas envie de tout retaper. La sauvegarde / reprise servait à l'époque car pour générer une image, il fallait plusieurs heures, voire plusieurs jours. Cela permettait d'arrêter la bécane sans tout perdre et de repartir ou, ce qui m'intéresse beaucoup plus, de sélectionner une zone que l'on jugeait "intéressante" dans une image comme point de départ pour en faire une nouvelle. Et les résultats étaient surprenants, même sous Win 3.11 !
    Bon, d'accord, il fallait être patient, mais avec les bécanes actuelles, c'est de la rigolade.
    Ceci dit, si tu as de bons programmes de fractales, je suis preneur.
    Encore merci à tout le monde.
    François

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 53
    Points : 72
    Points
    72
    Par défaut Images fractales
    Citation Envoyé par batyann811 Voir le message
    Une autre solution serait de profiter du passage de turbo pascal à freepascal pour changer de librairie graphique. Tu pourrais utiliser la SDL par exemple. Tu as un tuto ici. Comme ça plus de problème de gestion de format d'image tout est fait par la SDL. Dans le même genre que la SDL il y a aussi Allegro.pas.
    Bonjour,
    Je n'ai pas encore lu le mode d'emploi, mes est-ce que la SDL permet de sauvegarder une image ? Cela m'intéresse fort car, comme expliqué plus haut, j'ai un programme qui permet de sélectionner une zone d'une image existante pour générer un nouvel ensemble de Mandelbrot, et ceci, à l'infini. C'est là que cela devient intéressant.
    Encore merci.
    François.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Oui on peut sauver une image avec SDL_SaveBMP. C'est au format BMP comme l'indique le nom de la fonction.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/03/2011, 19h37
  2. Réponses: 2
    Dernier message: 09/08/2008, 14h30
  3. [DOM] Cherche source pour modifier un fichier xml
    Par Donatelli dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/08/2007, 19h50
  4. [langage] cherche script pour formater une chaine
    Par MASSAKA dans le forum Langage
    Réponses: 7
    Dernier message: 12/11/2003, 13h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo