Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Caml
Caml Forum d'entraide sur la programmation avec les langages fonctionnels Caml-Light et OCaml
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/12/2010, 22h52   #21
harrribo
Invité de passage
 
Inscription : février 2010
Messages : 27
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 27
Points : 3
Points : 3
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
Citation:
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 ?
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2010, 23h11   #22
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
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 :
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 ?
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 14h48   #23
harrribo
Invité de passage
 
Inscription : février 2010
Messages : 27
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 27
Points : 3
Points : 3
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.
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 15h53   #24
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
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.
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2010, 00h07   #25
harrribo
Invité de passage
 
Inscription : février 2010
Messages : 27
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 27
Points : 3
Points : 3
Par défaut C'est toujours moi ...

Voici ce j'ai testé pour compiler (google):
Sans aucune utilisation de camlimages
ça fonctionne bien
Code :
ocamlc -I +labltk -o test labltk.cma graphics.cma nums.cma test.ml

J'ai repris ce que tu m'avais donné :
Code :
ocamlfind ocamlc -o tes -package camlimages -linkpkg test.ml


Et voilà ce que je pense devoir obtenir

Code :
ocamlfind ocamlc -I +labltk -o test labltk.cma graphics.cma nums.cma camlimages -linkpkg test.ml
Mais le terminal me sort
Citation:
/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 -_-"
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2010, 01h05   #26
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
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`.
gasche est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/12/2010, 22h03   #27
harrribo
Invité de passage
 
Inscription : février 2010
Messages : 27
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 27
Points : 3
Points : 3
Merci beaucoup je peux enfin compiler
Code :
ocamlfind ocamlc -o test -package camlimages -package labltk -package graphics -package num -linkpkg test.ml
J'ai donc copié collé ton code
Code :
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
Citation:
Error while linking test.cmo: Reference to undefined global `Graphic_image'
Une idée ?
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 10h13   #28
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
Chez moi ça marche. Tu es sûr que tu n'as pas oublié `-linkpkg` ?
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 17h43   #29
harrribo
Invité de passage
 
Inscription : février 2010
Messages : 27
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 27
Points : 3
Points : 3
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
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 19h22   #30
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
"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 !
gasche est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/12/2010, 22h33   #31
harrribo
Invité de passage
 
Inscription : février 2010
Messages : 27
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 27
Points : 3
Points : 3
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,
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 23h37   #32
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
Code :
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 ()
gasche est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/12/2010, 00h51   #33
harrribo
Invité de passage
 
Inscription : février 2010
Messages : 27
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 27
Points : 3
Points : 3
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
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 23h54   #34
étudiante6
Invité de passage
 
Femme
Formateur en informatique
Inscription : 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 : 4
Points : 4
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;;
étudiante6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 14h49   #35
étudiante6
Invité de passage
 
Femme
Formateur en informatique
Inscription : 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 : 4
Points : 4
Par défaut [solution]

Code :
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;;
étudiante6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h18.


 
 
 
 
Partenaires

Hébergement Web