colorier une map pour faire une image

 

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

ulis, 2006-02-06. Nouvelle version v 0.2 pour mieux répartir les nuances (le spectre passe de 0-239 à 0-255).


Pourquoi

Pour avoir des images de toutes les couleurs et de toutes les luminosités. En particulier pour faire de beaux boutons, comme c'est à la mode. Ou des boutons qui s'allument graduellement : en augmentant la luminosité.


Comment

En multipliant les composants RGB de la couleur d'arrière-plan par l'indice de luminosité de chaque point.


Utilisation

  map2img map {bg white} {fg gray} {coef 1.0}
  # map : la map
  # bg : la couleur d'arrière-plan à multiplier par les indices de luminosité de la map. Sa valeur par défaut est 'white'.
  # fg : la couleur d'avant-plan correspondant à la luminosité d'avant-plan. Sa valeur par défaut est 'gray'.
  # coef : coefficient de correction de la luminosité (0.5 -> 5.0). Sa valeur par défaut est '1.0'.

La procédure

  # create a photo from a map

  proc map2img {map {bg white} {fg gray} {coef 1.0}} \
  {
    # v 0.2
    # get data
    set data [list]
    set line0 [lindex $map 0]
    set tr [string index $line0 0]
    set rf [string index $line0 1]
    if {$rf != "" && $rf != $tr} \
    {
      foreach {r g b} [winfo rgb . $fg] break
      foreach c {r g b} \
      {
        set v [set $c]
        set v [expr {$v / 256 / 16}]
        set $c [format %x%x $v $v]
      }
      set fg #$r$g$b
    }
    foreach {R G B} [winfo rgb . $bg] break
    foreach C {R G B} \
    {
      set v [set $C]
      set $C [expr {$v *$coef / 256}]
    }
    # create pixels map
    set data [list]
    set map [lrange $map 1 end]
    foreach line $map \
    {
      set row [list]
      foreach pix [split $line {}] \
      {
        switch -- $pix \
          $tr     { set color #000000 } \
          $rf     { set color $fg }  \
          default \
          {
            scan $pix %x light
            foreach C {R G B} c {r g b} \
            {
              set v [set $C]
              set v [expr {round($v * $light / 255.0)}]
              if {$v > 15} { set v 15 }
              set $c [format %x%x $v $v]
            }
            set color #$r$g$b
          }
        lappend row $color
      }
      lappend data $row
    }
    # create photo
    set photo [image create photo]
    $photo put $data
    # set transparency
    set width [image width $photo]
    set height [image height $photo]
    for {set y 0} {$y < $height} {incr y} \
    {
      set line [lindex $map $y]
      for {set x 0} {$x < $width} {incr x} \
      {
        if {[string index $line $x] == $tr} \
        {
          $photo transparency set $x $y 1
        }
      }
    }
    # return photo
    return $photo
  }

Démo

(la procédure sizemap est là : http://wfr.tcl.tk/RedimensionnerUneMap)

    # make colored buttons from the map

    wm title . map
    . config -width 200
    set fn button-2
    set map \
    {
      0
      0000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000
      00aaddddddddddddddddddddddddddddddddddddddddddaa00
      0adddddddddddddddddddddddddddddddddddddddddddddda0
      0adddddddddddddddddddddddddddddddddddddddddddddda0
      adddddddddddddddddddddddddddddddddddddddddddddddda
      adddddddddddddddddddddddddddddddddddddddddddddddda
      adddddddddddddddddddddddddddddddddddddddddddddddda
      adddddddddddddddddddddddddddddddddddddddddddddddda
      adddddddddddddddddddddddddddddddddddddddddddddddda
      adddddddddddddddddddddddddddddddddddddddddddddddda
      adddddddddddddddddddddddddddddddddddddddddddddddda
      9cccccccccccccccccccccccccccccccccccccccccccccccc9
      9cccccccccccccccccccccccccccccccccccccccccccccccc9
      9cccccccccccccccccccccccccccccccccccccccccccccccc9
      9cccccccccccccccccccccccccccccccccccccccccccccccc9
      9cccccccccccccccccccccccccccccccccccccccccccccccc9
      09cccccccccccccccccccccccccccccccccccccccccccccc90
      09cccccccccccccccccccccccccccccccccccccccccccccc90
      0099dddddddddddddddddddddddddddddddddddddddddd9900
      00009999999999999999999999999999999999999999990000
    }
    set map [sizemap $map 90 30]
    grid [label .l -text $fn] -row 0 -columnspan 3 -pady 2
    set row 1
    set col 0
    foreach color \
    {white gray90 red green yellow magenta orange cyan #c0e0ff} \
    {
      button .$color -bd 0 -highlightt 0 \
        -width 0 -height 0 -padx 0 -pady 0 \
        -text $color -fg gray40 -compound center \
        -image [map2img $map $color]
      grid .$color -row $row -column $col -padx 5 -pady 5
      if {[incr col] == 3} \
      {
        set col 0
        incr row
      }
    }

Démo 2

    package require Tk

    set map \
    {
      0
      0feeeeeeeeeeeed0
      ffdddddddccccced
      eeddddcccccccccd
      edddccccccbbbbcd
      eddcccccbbbbbbcd
      edccccbbbbbbbbcd
      edcccbbbbbbbbbcd
      edcccbbbbbbbbbcd
      ecccbbbbbbbbbbbd
      ecccbbbbbbbbbbbd
      eccbbbbbbbbbbbbd
      eccbbbbbbbbbbbbd
      eccbbbbbbbbbbbbd
      eccccbbbbbbbbbbd
      edccccccbbbbbbcd
      0eddddddddddddd0
    }

    set n 0
    foreach coef {0.6 0.7 0.8 0.9 1.0 1.1 1.2} \
    {
      button .$n -bd 0 -highlightt 0 \
        -image [map2img $map green "" $coef]
      pack .$n -side left -padx 10 -pady 10
      incr n
    }
    focus -force .
    raise .

Voir aussi


Discussion

dc c'est réellement extra. C'est effectivement parfait pour agrémenter une application de jolis boutons facilement fait sans piquer sur Internet des choses dont on ne sait pas trop si c'est du libre ! Essayer c'est l'adopter. Merci.


ulis: moved from créer une map à partir d'une image

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 .

[SRIV] Version 0.2 works fine. I was using the first version, which with the demo on http://wfr.tcl.tk/1071 had thrown an error.


dMc la ligne

  set map [sizemap $map 90 30]

empêche le fonctionnement de le 1ère demo : ça marche quand on la supprime.

ulis Oui, car elle vient d'une autre page qui est là : http://wfr.tcl.tk/RedimensionnerUneMap

(ça n'avait rien d'évident)


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