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

Caml Discussion :

[OCaml] Ouvrir / Enregistrer une Image


Sujet :

Caml

  1. #21
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Points : 10
    Points
    10
    Par défaut
    J'ai tout désinstallé ocaml sur mon ordinateur.

    Je suis allé sur debian.org
    J'ai voulu installé ocaml-3.10.2
    Il me fallait ocaml-nox .
    Etc etc

    Au final j'ai installé tout ce qu'il m'a dit qu'il manquait (par paquets deb téléchargés sur le site)

    J'ai relancé le dec de camlimages
    Paquet : libcamlimages-ocaml
    Etat : La même version est déjà installée
    Donc Camlimages est installé (apparemment)

    Je lance donc Ocaml
    rlwrap ocaml
    -> ok
    rlwrap ocaml graphics.cma
    -> ok

    rlwrap ocaml graphics.cma camlimages.cma
    -> Cannot find file camlimages.cma.
    Je m'y prends mal ?

  2. #22
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    C'est simple *si* tu as installé findlib, dans debian c'est le paquet ocaml-findlib.

    Alors en toplevel, la commande suivante devrait marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #use "topfind";;  (* active findlib dans le toplevel *)
    #require "camlimages";;
    Pour la compilation d'un fichier source, la commande que j'ai donnée avant (ocamlfind ocamlc -package camlimages -linkpkg ...) devrait convenir.

    Pourquoi télécharges-tu les paquets uns par uns au lieu d'utiliser apt-get pour les obtenir ?

  3. #23
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Points : 10
    Points
    10
    Par défaut
    Je ne suis pas passé par synaptics ou le terminal, car ca m'installait ocaml-3.10.0
    et camlimages2.2 nécessite 3.10.2.
    Donc une fois parti sur le site pour récupérer les .deb, je n'étais plus à 2 paquets prêts pour installer camlimages ^^


    La manip que tu me donnes c'est pour compiler et avoir un executable.
    Ce que je cherche à faire moi, c'est charger le fichier .ml à partir d'ocaml.
    à la fin seulement, compiler le tout.

    Etant donné que je perds du temps à apprendre la langage, j'aimerais gagné du temps à ne pas compiler à chaque fois : j'ai intégré le terminal dans gedit pour que j'aille plus vite.

  4. #24
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Compiler un fichier Caml prend moins d'une seconde. Je ne pense pas qu'on puisse perdre du temps si on a les bons outils.

    La manipulation avec des # (des directives toplevel) est à faire dans le toplevel (ou interpréteur interactive, qui est sans doute ce que tu appelles "ocaml"), et permet d'y activer camlimages simplement.

  5. #25
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Points : 10
    Points
    10
    Par défaut C'est toujours moi ...
    Voici ce j'ai testé pour compiler (google):
    Sans aucune utilisation de camlimages
    ça fonctionne bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ocamlc -I +labltk -o test labltk.cma graphics.cma nums.cma test.ml

    J'ai repris ce que tu m'avais donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ocamlfind ocamlc -o tes -package camlimages -linkpkg test.ml


    Et voilà ce que je pense devoir obtenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ocamlfind ocamlc -I +labltk -o test labltk.cma graphics.cma nums.cma camlimages -linkpkg test.ml
    Mais le terminal me sort
    /usr/bin/ocamlc: don't know what to do with camlimages.
    Usage: ocamlc <options> <files>
    Options are:
    -a Build a library
    ...
    ...
    ...
    Je lui ai bien dit micro branché : "l'utiliser pour la compilation" mais ça ne semble pas fonction

    Dois-je utiliser camlimages pour qu'il me le compile, ou ce n'est pas nécessaire ?


    edit : les directives top level sont bien fonctionnelles et ce même sans "code camlimages"
    Y'a pas de souci, mais maintenant, je préfère quand même vérifier le plus basique -_-"

  6. #26
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    C'est `-package camlimages` et pas `camlimages` tout seul. Par ailleurs, plutôt que tout le bloc `-I +labltk labltk.cma`, tu peux sans doute mettre `-package labltk`. De même, `-package graphics` et `-package num` (num et pas nums) sont tes amis. Pour voir la liste des paquets que ocamlfind connaît, `ocamlfind list`.

  7. #27
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup je peux enfin compiler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ocamlfind ocamlc -o test -package camlimages -package labltk -package graphics -package num -linkpkg test.ml
    J'ai donc copié collé ton code
    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
    (* charge une image quelconque (.jpg,.png... comme supporté par
       camlimages) vers une matrice de triplets (r,g,b) d'entiers :
       (int*int*int)*array*array *)
    let load_rgb_matrix name =
      let img = Images.load name [] in
      let gimg = Graphic_image.array_of_image img in
      let rgb color =
        let quot n = n mod 256, n / 256 in
        let b, rg = quot color in
        let g, r = quot rg in
        r, g, b
      in
      Array.map (Array.map rgb) gimg
     
    (* transforme une matrice de triplets (r,g,b) en une "image graphics"
       de type Graphics.image *)
    let to_graphics rgb_matrix =
      Graphics.make_image
        (Array.map
           (Array.map
              (fun (r, g, b) -> Graphics.rgb r g b))
           rgb_matrix)
     
     
    let map_matrix f matrix = Array.map (Array.map f) matrix
     
    let invert_colors = map_matrix
      (fun (r, g, b) -> (255-r, 255-g, 255-b))
     
     
    let () =
      (* charge l'image donnée en argument : "./test truc.png" *)
      let test = load_rgb_matrix Sys.argv.(1) in
      Graphics.open_graph " 800x600";
      (* dessine l'image une première fois *)
      Graphics.draw_image (to_graphics test) 0 0;
      ignore (Graphics.read_key ());
      (* dessine l'image avec les couleurs inversées *)
      Graphics.draw_image (to_graphics (invert_colors test)) 0 0;
      ignore (Graphics.read_key ());
      Graphics.close_graph ()

    Et à la compilation j'obtiens cette erreur
    Error while linking test.cmo: Reference to undefined global `Graphic_image'
    Une idée ?

  8. #28
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Chez moi ça marche. Tu es sûr que tu n'as pas oublié `-linkpkg` ?

  9. #29
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Points : 10
    Points
    10
    Par défaut
    Oui j'ai bien rajouté '-linkpkg'

    Je viens de rajouter
    -package camlimages.graphics
    ça compile

    Mais quand je lance mon exécutable par ./test

    j'ai cette erreur
    Fatal error: exception Invalid_argument("index out of bounds")


    et en passant par le toplevel idem
    - camlimages : connait pas Graphics_image
    - camlimages.graphics : out of bound



    J'ai l'impression que si ca continue comme ça, c'est la première et dernière fois que je touche à un projet prêtant du OCaml

  10. #30
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    "Index out of bounds" c'est une erreur à l'exécution, pas à la compilation. Il y a un tableau dans le programme à qui on demande un élément qui n'est pas dans son domaine de définition. C'est Sys.argv.(1), qui prend le premier élément en ligne de commande (comme le précise un commentaire dans le code) : tu as oublié de passer un paramètre en ligne de commande en exécutant le programme.

    Ce serait dommage d'abandonner maintenant que tu as appris comment compiler un programme !

  11. #31
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Points : 10
    Points
    10
    Par défaut
    Génial.
    Merci beaucoup. Comme un abruti, j'ai modifié, tout content de moi, le commentaire : je n'avais pas lu la bonne ligne -_-"


    Pour sauvegarder, c'est

    Graphics.dump_image
    Images.save Mon_nom []

    Mais ça me parait trop simple,

  12. #32
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    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
    (*
      ocamlfind ocamlc -package graphics -package camlimages -linkpkg test.ml -o test
    *)
     
    (* charge une image quelconque (.jpg,.png... comme supporté par
       camlimages) vers une matrice de triplets (r,g,b) d'entiers :
       (int*int*int)*array*array *)
    let load_rgb_matrix name =
      let img = Images.load name [] in
      let gimg = Graphic_image.array_of_image img in
      let rgb color =
        let quot n = n mod 256, n / 256 in
        let b, rg = quot color in
        let g, r = quot rg in
        r, g, b
      in
      Array.map (Array.map rgb) gimg
     
    (* sauvegarde une image grpahics de type Graphics.image dans le
       fichier au format de son choix (.png, .jpg...) *)
    let save_image image file_name =
      let img = Images.Rgb24 (Graphic_image.image_of image) in
      Images.save file_name None [] img
     
    (* transforme une matrice de triplets (r,g,b) en une "image graphics"
       de type Graphics.image *)
    let to_graphics rgb_matrix =
      Graphics.make_image
        (Array.map
           (Array.map
              (fun (r, g, b) -> Graphics.rgb r g b))
           rgb_matrix)
     
    let map_matrix f matrix = Array.map (Array.map f) matrix
     
    let invert_colors = map_matrix
      (fun (r, g, b) -> (255-r, 255-g, 255-b))
     
     
    (* Utilisation : il faut donner deux noms de fichier en ligne de commande
         ./test truc.png machin.jpg
    *)
    let () =
      (* charge l'image donnée en premier argument : truc.png dans
         l'exemple *)
      let test = load_rgb_matrix Sys.argv.(1) in
      Graphics.open_graph " 800x600";
      (* dessine l'image une première fois *)
      Graphics.draw_image (to_graphics test) 0 0;
      ignore (Graphics.read_key ());
      (* dessine l'image avec les couleurs inversées *)
      let img = to_graphics (invert_colors test) in
      Graphics.draw_image img 0 0;
      ignore (Graphics.read_key ());
      save_image img Sys.argv.(2);
      (* écrit l'image inversée dans le fichier donné en second argument :
         machin.png dans l'exemple *)
      Graphics.close_graph ()

  13. #33
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Points : 10
    Points
    10
    Par défaut
    Merci. Je n'étais pas loin, c'est même plus simple.

    Là je bloquais sur l'utilisation en 2 temps:
    Premier temps Fonction 1
    - ouvrir image
    - tracer un rectangle dessus

    Deuxième temps, Fonction 2 différente de 1
    - enregistrer

    Dans enregistrer j'étais bloqué sur passer de pixels->image physique.
    J'utilisais dump_image au lieu de get_image.

    Graphics.make_image
    Matrice-> image
    Graphics.dump_image
    Image -> matrice

    Graphics.get_image
    "Découpe" une image
    Graphics.draw_image
    Dessine une image

    Merci beaucoup

  14. #34
    Futur Membre du Club
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Points : 6
    Points
    6
    Par défaut récupérer les coordonnées de la position courante de la souris ?
    Bonjour,
    je veux stocker dans une liste les coordonnées de la position de la souris quand je la bouge,
    en fait ça me servira après à sélectionner une zone dans la fenêtre graphique .
    voici ce que j'ai fait ! :
    ( est-ce que je suis sensée utiliser mouse_motion ?!
    (*------------------------------------------------------------------------------------------------------*)
    let clic im =
    let l = ref [] in
    let i = ref 0 in
    open_sho im;
    let rec aux () =
    match read_key() with
    |'s' -> (*start *)
    begin
    let attends = Graphics.wait_next_event [ Button_down] in
    let abscisse = attends.mouse_x
    and ordonnee = attends.mouse_y
    in

    l := maj_liste !l (abscisse,ordonnee);

    while attends.button do
    abscisse = attends.mouse_x;
    ordonnee = attends.mouse_y;
    l := maj_liste !l (abscisse,ordonnee);

    i := !i+1;
    done;
    aux ();
    end;
    |'c' -> close_graph()
    |_ -> aux()
    in aux ();
    !l;;

  15. #35
    Futur Membre du Club
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Points : 6
    Points
    6
    Par défaut [solution]
    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
     
    let dessiner t im = 
      let rec loop t =
          (*    if !compteur = 0 then 
    	    Unix.sleep 5;*)
        let eve = wait_next_event [Mouse_motion;Key_pressed]
        in
        if eve.keypressed
        then 
          match eve.key with
    	|'b' -> set_color black; loop t
    	|'r' ->set_color red ; loop t
    	|'l' -> !liste_z 
    	|'c' ->
    	  begin  
    	    liste_z := [];
    	    clear_graph();
    	    show_im im;
    	    (* sleep 4; *)
    	    loop t;
    	  end
    	|_ -> loop t
        else 
          begin 
    	compteur := !compteur+1;
    	fill_circle (eve.mouse_x) (eve.mouse_y) t;
    	liste_z:= maj_liste !liste_z (eve.mouse_x, eve.mouse_y); 
    	loop t
          end	
      in 
      try loop t 
      with  Quit -> close_graph(); 
        !liste_z;;

Discussions similaires

  1. ENREGISTRER UNE IMAGE OU UN FICHIER .DOC
    Par manudja dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/08/2005, 13h32
  2. enregistrer une image
    Par meli0207 dans le forum MFC
    Réponses: 35
    Dernier message: 12/07/2005, 09h00
  3. [GLScene] Comment enregistrer une image au format TGA
    Par Invité dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 27/05/2005, 15h12
  4. Enregistrer une image
    Par N@sH dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 04/05/2005, 10h07
  5. enregistrer une image et un identifiant
    Par dosach dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/03/2004, 17h18

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