créer une map à partir d'une image

 

ulis, 2006-01-29. Une procédure pour créer une map à partir d'une image.

ulis, 2006-02-06. Ajout de l'URL pour télécharger l'image de la démo. Rectification de la map (blanc et noir étaient inversés).

(on voit que ne retenir que 16 niveaux de luminosité augmente le contraste, et que prendre la moyenne baisse la luminosité)


Pourquoi

Pourquoi tout réinventer ? Il suffit de glaner sur iInternet pour trouver de bonnes idées. Et de jolis boutons.


Comment

L'indice de luminosité d'un point est calculé en faisant la moyenne des composants RGB de la couleur.


Utilisation

  img2map {photo {tr 0} {fg ""}
  # photo : une image de type photo
  # tr : indice de luminosité correspondant aux points transparents. Sa valeur par défaut est '0'.
  # fg : indice de luminosité correspondant à la couleur d'avant-plan. Sa valeur par défaut est "".

La procédure

  # create a map from a photo

  proc img2map {photo {tr 0} {fg ""}} \
  {
    # add transparency color & foreground color
    set map [list $tr$fg]
    # add brightness
    foreach row [$photo data] \
    {
      set line ""
      foreach pix $row \
      {
        foreach {r g b} [winfo rgb . $pix] break
        set v [expr {round(($r + $g + $b) / 256 / 15 / 3.0)}]
        if {$v > 15} { set v 15 }
        append line [format %x $v]
      }
      lappend map $line
    }
    # return map
    return $map
  }

Démo

  # to download right.gif : [http://wfr.tcl.tk/fichiers/ulis/right.gif]

    package require Tk

    wm title . img2map
    set img [image create photo -file right.gif]
    set map [img2map $img]
    puts [join $map \n]
    # result after updating the first line
    # & adding the transparency:
    set map \
    {
      0f
      0cbbaaaaaaaaaaa9a0
      cabaa9988887776545
      bbbaa9999887777653
      baaa9988df77666553
      b9a99887fff6665553
      a99988777fff655554
      a788777776fff55553
      a7787777666fff5453
      a67ffffffffffff543
      a67ffffffffffff543
      a6777777766fff5543
      a677777767fff55443
      966777766fff554433
      95667666fff5544432
      95566666cf55544432
      945556555554544332
      934454444444433334
      042333333333333240
    }
    . config -padx 40 -pady 20
    label .img -image $img
    pack .img -side left -padx 5
    foreach color {green white red} \
    {
      label .$color -image [map2img $map $color white 1.25]
      pack .$color -side left -padx 5
    }
    focus -force .
    raise .

Voir aussi


Discussion

Feb 6, 2006 Steve Redler IV Sorry for my lack of french, but in order for this demo to work correctly for me, I had to modify one line in map2img

 line 15   set fg [format #%02x%02x%02x $r $g $b]

ulis: Steve, to help me understand the problem you faced, please, send me the image you tried to translate into a map. My mail is ulis.net(at)wanadoo.fr .

ulis: Moved this comment to colorier une map pour faire une image (aka map2img)


ulis, 2006-02-06.

L'image du milieu montre bien l'augmentation du contraste et la perte des nuances. Pour l'éviter en partie, il vaudrait mieux avoir des digits en base 256 plutôt qu'en base 16. Mais on perdrait la possibilité de manipuler facilement les maps avec un simple éditeur.


Catégorie Exemple | Catégorie Traitement d'image