Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 35
  1. #1
    Invité de passage
    Inscrit en
    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.

  2. #2
    Membre Expert
    Inscrit en
    avril 2007
    Messages
    831
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 831
    Points : 1 009
    Points
    1 009

    Par défaut

    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 ()

  3. #3
    Membre émérite
    Avatar de Cacophrene
    Profil pro Phrene Caco
    Inscrit en
    janvier 2009
    Messages
    533
    Détails du profil
    Informations personnelles :
    Nom : Phrene Caco

    Informations forums :
    Inscription : janvier 2009
    Messages : 533
    Points : 951
    Points
    951

    Par défaut

    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

  4. #4
    Membre Expert
    Inscrit en
    avril 2007
    Messages
    831
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 831
    Points : 1 009
    Points
    1 009

    Par défaut

    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.

  5. #5
    Membre émérite
    Avatar de Cacophrene
    Profil pro Phrene Caco
    Inscrit en
    janvier 2009
    Messages
    533
    Détails du profil
    Informations personnelles :
    Nom : Phrene Caco

    Informations forums :
    Inscription : janvier 2009
    Messages : 533
    Points : 951
    Points
    951

    Par défaut

    D'accord, c'est cohérent.

  6. #6
    Invité de passage
    Inscrit en
    février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : février 2010
    Messages : 27
    Points : 3
    Points
    3

    Par défaut

    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é :
    #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é ?

  7. #7
    Membre émérite
    Avatar de Cacophrene
    Profil pro Phrene Caco
    Inscrit en
    janvier 2009
    Messages
    533
    Détails du profil
    Informations personnelles :
    Nom : Phrene Caco

    Informations forums :
    Inscription : janvier 2009
    Messages : 533
    Points : 951
    Points
    951

    Par défaut

    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

  8. #8
    Invité de passage
    Inscrit en
    février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : février 2010
    Messages : 27
    Points : 3
    Points
    3

    Par défaut

    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.

  9. #9
    Membre émérite
    Avatar de Cacophrene
    Profil pro Phrene Caco
    Inscrit en
    janvier 2009
    Messages
    533
    Détails du profil
    Informations personnelles :
    Nom : Phrene Caco

    Informations forums :
    Inscription : janvier 2009
    Messages : 533
    Points : 951
    Points
    951

    Par défaut

    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

  10. #10
    Membre Expert
    Inscrit en
    avril 2007
    Messages
    831
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 831
    Points : 1 009
    Points
    1 009

    Par défaut

    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";

  11. #11
    Membre émérite
    Avatar de Cacophrene
    Profil pro Phrene Caco
    Inscrit en
    janvier 2009
    Messages
    533
    Détails du profil
    Informations personnelles :
    Nom : Phrene Caco

    Informations forums :
    Inscription : janvier 2009
    Messages : 533
    Points : 951
    Points
    951

    Par défaut

    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

  12. #12
    Membre Expert
    Inscrit en
    avril 2007
    Messages
    831
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 831
    Points : 1 009
    Points
    1 009

    Par défaut

    É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.

  13. #13
    Invité de passage
    Inscrit en
    février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : février 2010
    Messages : 27
    Points : 3
    Points
    3

    Par défaut

    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
    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.

  14. #14
    Invité de passage
    Inscrit en
    février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : février 2010
    Messages : 27
    Points : 3
    Points
    3

    Par défaut

    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:
    tar xzvf camlimages-2.2.0.tgz
    cd camlimages-2.2
    ./configure --prefix /home/harrribo
    make ; make install

    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.

  15. #15
    Membre Expert
    Inscrit en
    avril 2007
    Messages
    831
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 831
    Points : 1 009
    Points
    1 009

    Par défaut

    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é.

  16. #16
    Invité de passage
    Inscrit en
    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é.

  17. #17
    Invité de passage
    Inscrit en
    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 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

  18. #18
    Invité de passage
    Inscrit en
    février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : février 2010
    Messages : 27
    Points : 3
    Points
    3

    Par défaut

    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

  19. #19
    Membre émérite
    Avatar de Cacophrene
    Profil pro Phrene Caco
    Inscrit en
    janvier 2009
    Messages
    533
    Détails du profil
    Informations personnelles :
    Nom : Phrene Caco

    Informations forums :
    Inscription : janvier 2009
    Messages : 533
    Points : 951
    Points
    951

    Par défaut

    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

  20. #20
    Membre Expert
    Inscrit en
    avril 2007
    Messages
    831
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 831
    Points : 1 009
    Points
    1 009

    Par défaut

    Si tu utilises debian (ou ubuntu) ou fedora, il existe déjà un paquet précompilé pour ta distribution.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •