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 13/11/2010, 00h10   #1
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 [OCaml] Ouvrir / Enregistrer une Image

Bonsoir,

Je suis souhaite dans un premier temps à ouvrir une image de mon disque dur et l'afficher dans la fenêtre graphique Graphics d'OCaml.

J'ai vu que CamlImage permettait de faire cela http://pauillac.inria.fr/camlimages/
Mais je ne trouve pas de doc parlant de ImageLoad.
(sans compter sur le dump_image, etc je n'ai pas saisi encore)


Donc je ne vais pas chercher à faire plus compliqué à savoir
- ouvrir une image n'importe où sur le disque
- enregistrer l'image


Si vous pouviez m'aiguiller pour une doc/des exemples d'utilisation de camlimages, je vous remercie.
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2010, 09h07   #2
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
Hop, un petit exemple:

Code ocaml :
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 ()
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2010, 09h31   #3
Cacophrene
Membre émérite
 
Avatar de Cacophrene
 
Phrene Caco
Inscription : janvier 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Phrene Caco

Informations forums :
Inscription : janvier 2009
Messages : 525
Points : 943
Points : 943
Bonjour,

Bluestorm, un petit point de détail, tu définis map_matrix mais tu ne l'utilises pas.
(en fait si, mais une seule fois alors qu'elle peut servir presque partout).

Cordialement,
Cacophrène
Cacophrene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2010, 09h35   #4
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
La raison pour laquelle je ne m'en suis pas servie dans les deux premières fonctions, c'est parce que je m'attends à ce qu'elles soient copiée de mon code autre part, et que j'essaie donc de les faire les plus autonomes possibles. `map_matrix` est là pour signaler le motif commun, et peut-être encourager le lecteur à l'utiliser aussi, mais la priorité c'est d'arriver à charger des images.
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2010, 09h43   #5
Cacophrene
Membre émérite
 
Avatar de Cacophrene
 
Phrene Caco
Inscription : janvier 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Phrene Caco

Informations forums :
Inscription : janvier 2009
Messages : 525
Points : 943
Points : 943
D'accord, c'est cohérent.
Cacophrene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2010, 20h05   #6
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
Réponses très rapides, je vous remercie.

Je suis en train d'essayer de comprendre la manipulation, je n'ai pas envie de copier bêtement.
Cependant j'ai copié bêtement quand même pour voir ce que ça peut donner. Malheureusement quand je veux lancer le code j'obtiens un

Reference to undefined global `Graphic_image'


Actuellement j'ai dans les chargements de librairies
#directory "+labltk";;
#load "labltk.cma";;
#load "graphics.cma";;


J'ai rajouté :
Citation:
#directory "/usr/lib/ocaml/3.10.0/camlimages/";;
#load "ci_core.cma";;
#load "ci_png.cma";;
#load "ci_jpg.cma";;
Qu'est ce que j'ai oublié ?
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2010, 20h48   #7
Cacophrene
Membre émérite
 
Avatar de Cacophrene
 
Phrene Caco
Inscription : janvier 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Phrene Caco

Informations forums :
Inscription : janvier 2009
Messages : 525
Points : 943
Points : 943
Bonsoir,

Normalement il suffit de lancer ocaml avec -I +camlimages et camlimages.cma qui nécessite graphics.cma. Ou alors :

Code :
1
2
3
4
5
#directory "+camlimages";;
#load "graphics.cma";;
#load "camlimages.cma";;
#
Cordialement,
Cacophrène
Cacophrene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2010, 19h23   #8
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
Malheureusement cela ne fonctionne pas.

Mon #load "ci_jpg.cma";; mis au vol, n'est pas bon, il me le dit.

Mais en mettant ce que tu m'as proposé, j'ai toujours la même chose.
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2010, 20h08   #9
Cacophrene
Membre émérite
 
Avatar de Cacophrene
 
Phrene Caco
Inscription : janvier 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Phrene Caco

Informations forums :
Inscription : janvier 2009
Messages : 525
Points : 943
Points : 943
Bonsoir,

Citation:
Envoyé par harribo
Malheureusement cela ne fonctionne pas.

Mon #load "ci_jpg.cma";; mis au vol, n'est pas bon, il me le dit.

Mais en mettant ce que tu m'as proposé, j'ai toujours la même chose.
Je vais réinstaller camlimages 2.2 sur mon ordi et tester un peu plus... mes souvenirs de cette lib commencent à dater.

Cordialement,
Cacophrène
Cacophrene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 08h13   #10
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
Pour information, moi j'utilise ocamlfind et tout marche bien :
Code :
ocamlfind ocamlc -o tes -package camlimages -linkpkg test.ml
(Ça devrait aussi marcher dans le toplevel : #use topfind;; #require "camlfimages";
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 06h43   #11
Cacophrene
Membre émérite
 
Avatar de Cacophrene
 
Phrene Caco
Inscription : janvier 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Phrene Caco

Informations forums :
Inscription : janvier 2009
Messages : 525
Points : 943
Points : 943
Bonjour,

Oui, ocamlfinf a l'air bien utile avec ces libs... c'est tentant.
De mon côté je me demande quelle version de camlimages utilise le PO ? La 2.2 ?

Cordialement,
Cacophrène
Cacophrene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 08h19   #12
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
Étant donné que j'ai repris (et un peu adapté) un morceau de code que j'avais écrit il y a maintenant 5 ans, je pense que ça ne fait pas une grosse différence.
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 20h49   #13
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
ReBonjour,
Merci de votre attention et désolé de n'avoir pas répondu plus tôt, je me suis penché sur un autre projet et j'ai laissé de côté un peu celui-ci. Mais je vais le reprendre

Qu'entends-tu par
Citation:
De mon côté je me demande quelle version de camlimages utilise le PO ? La 2.2 ?
Il me semble que de mon côté, Synaptics (Ubuntu) me proposait la 1.3ou1.6.
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2010, 15h11   #14
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 enfin réussi à télécharger camlimages-2.2 du site d'Inria : auparavant : j'avais un "Impossible blablabla..."

Mais j'ai un souci à l'installation, visiblement au "make"

Voici ce que j'ai fait:
Citation:
tar xzvf camlimages-2.2.0.tgz
cd camlimages-2.2
./configure --prefix /home/harrribo
make ; make install

Citation:
harrribo@harrribo-desktop:~/camlimages-2.2$ make
for i in corelib ppm bmp xvthumb jpeg tiff gif png xpm ps graphics freetype lablgtk2; do (cd $i; make byt) || exit $?; done
make[1]: entrant dans le répertoire « /home/harrribo/camlimages-2.2/corelib »
ocamlc -c camlimages.ml
ocamlc -c color.ml
ocamlc -c bitmap.ml
File "bitmap.ml", line 329, characters 8-12:
Warning Y: unused variable size.
if test "X" = "X"; then \
ocamlc -a -linkall -o ci_core.cma \
camlimages.cmo mstring.cmo color.cmo region.cmo tmpfile.cmo bitmap.cmo genimage.cmo rgba32.cmo rgb24.cmo index8.cmo index16.cmo cmyk32.cmo images.cmo oColor.cmo oImages.cmo reduce.cmo geometry.cmo colorhist.cmo blend.cmo ; \
else \
ocamlmklib -linkall -o ci_core \
camlimages.cmo mstring.cmo color.cmo region.cmo tmpfile.cmo bitmap.cmo genimage.cmo rgba32.cmo rgb24.cmo index8.cmo index16.cmo cmyk32.cmo images.cmo oColor.cmo oImages.cmo reduce.cmo geometry.cmo colorhist.cmo blend.cmo ; \
fi
make[1]: quittant le répertoire « /home/harrribo/camlimages-2.2/corelib »
make[1]: entrant dans le répertoire « /home/harrribo/camlimages-2.2/ppm »
make[1]: Rien à faire pour « byt ».
make[1]: quittant le répertoire « /home/harrribo/camlimages-2.2/ppm »
make[1]: entrant dans le répertoire « /home/harrribo/camlimages-2.2/bmp »
make[1]: Rien à faire pour « byt ».
make[1]: quittant le répertoire « /home/harrribo/camlimages-2.2/bmp »
make[1]: entrant dans le répertoire « /home/harrribo/camlimages-2.2/xvthumb »
make[1]: Rien à faire pour « byt ».
make[1]: quittant le répertoire « /home/harrribo/camlimages-2.2/xvthumb »
make[1]: entrant dans le répertoire « /home/harrribo/camlimages-2.2/jpeg »
make[1]: Rien à faire pour « byt ».
make[1]: quittant le répertoire « /home/harrribo/camlimages-2.2/jpeg »
make[1]: entrant dans le répertoire « /home/harrribo/camlimages-2.2/tiff »
ocamlc -ccopt "-I.. -g -O2" -c tiffread.c
tiffread.c:24:1: attention : « int16 » redéfini
Dans le fichier inclus à partir de /usr/lib/ocaml/3.10.0/caml/mlvalues.h:20,
à partir de tiffread.c:16:
/usr/lib/ocaml/3.10.0/caml/compatibility.h:313:1: attention : ceci est la localisation d'une précédente définition
tiffread.c:25:1: attention : « uint16 » redéfini
/usr/lib/ocaml/3.10.0/caml/compatibility.h:314:1: attention : ceci est la localisation d'une précédente définition
tiffread.c: Dans la fonction «open_tiff_file_for_read» :
tiffread.c:54: erreur: «uint16» undeclared (first use in this function)
tiffread.c:54: erreur: (Each undeclared identifier is reported only once
tiffread.c:54: erreur: for each function it appears in.)
tiffread.c:54: erreur: expected «;» before «imagesample»
tiffread.c:55: erreur: expected «;» before «imagebits»
tiffread.c:58: erreur: expected «;» before «runit»
tiffread.c:60: erreur: expected «;» before «photometric»
tiffread.c:64: erreur: «imagebits» undeclared (first use in this function)
tiffread.c:65: erreur: «imagesample» undeclared (first use in this function)
tiffread.c:66: erreur: «runit» undeclared (first use in this function)
tiffread.c:69: erreur: «photometric» undeclared (first use in this function)
make[1]: *** [tiffread.o] Erreur 2
make[1]: quittant le répertoire « /home/harrribo/camlimages-2.2/tiff »
make: *** [byt] Erreur 2
harrribo@harrribo-desktop:~/camlimages-2.2$

Comme fixer cela ? Merci.
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2010, 09h54   #15
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
Après avoir lancé le configure, va dans "config.h" et vire la ligne qui parle de TIFF. Ensuite "make" n'essaiera pas de compiler le code de tiff, qui est vieux et cassé.
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 09h23   #16
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 Nouvelle erreur

J'obtiens désormais cette erreur :


cp -pfR Makefile.config /usr/lib/ocaml/3.10.0/camlimages
cp -pfR config.h /usr/lib/ocaml/3.10.0/camlimages
ranlib /usr/lib/ocaml/3.10.0/camlimages/*.a
ranlib: could not create temporary file whilst writing archive: No more archived files
make: *** [install] Erreur 1


Et quand j'essaye de lancer mon .ml, j'ai un cannot find camlimages.cma, donc pas insallé.
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2010, 17h40   #17
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
C'est encore moi


Une connaissance m'a dit d'utiliser "Convert" sur linux qui me permet de convertir mes images .jpg (par exemple) et donc me passer de camlimages.


J'ai cherché sur google , mais je n'ai pas trouvé en quoi cela m'est vraiment utile, puisque qu'il faut que je charge mon image dans le module Graphics.
Moi je m'en fiche si je dois bosser que sur un certain type d'image ou non.

Si OCaml possède une fonction Chargement/Ouverture/Sauvegarde d'image tant mieux.
Parce que là Camlimages commence vraiment à m'énerver, j'ai sans cesse des erreurs à l'installation
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 13h53   #18
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
Serait-il possible que quelqu'un possédant une version de Camlimages fonctionnant sur son ordinateur puisse l'uploader et me donner le lien ?
Ainsi que la démarche d'installation ? Merci
harrribo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 20h29   #19
Cacophrene
Membre émérite
 
Avatar de Cacophrene
 
Phrene Caco
Inscription : janvier 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Phrene Caco

Informations forums :
Inscription : janvier 2009
Messages : 525
Points : 943
Points : 943
Bonsoir,

Pour commencer, voici le lien vers camlimages 3.0.2, l'une des toutes dernières versions. Ensuite il faut charger le fichier ocaml.ma4. Au besoin je peux détailler, c'est assez chiant à installer...

Cordialement,
Cacophrène
Cacophrene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 14h54   #20
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
Si tu utilises debian (ou ubuntu) ou fedora, il existe déjà un paquet précompilé pour ta distribution.
gasche 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 17h19.


 
 
 
 
Partenaires

Hébergement Web