Serializing a bitmap

ulis, 2003-06-22 A bitmap image can be serialized by saving it in a string that can be used to create later a new bitmap with the same content.


save and restore procs

  # ==============================
  #
  #   serializing a bitmap
  #
  # ==============================

  # ---------------------
  # bitmap:save proc
  #
  # return a serialized bitmap
  # ---------------------
  # parm1: image name
  # ---------------------
  # return: serialized bitmap
  # ---------------------
  # use:
  #   bitmap:save name
  # ---------------------

  proc bitmap:save {name} \
  {
    # save name
    set res [list $name]
    # save options
    set options {}
    foreach key {-back -fore -data -maskdata -file -maskfile} \
    {
      set value [$name cget $key]
      if {$value != ""} { lappend options [list $key $value] }
    }
    lappend res $options
    # return string
    return $res
  }
  
  # ---------------------
  # bitmap:restore
  #
  # create a bitmap from a serialized one
  # ---------------------
  # parm1: serialized bitmap
  # parm2: optional name option
  #   -noname: don't restore the name
  #   non empty: set the name with parm2
  # ---------------------
  # use:
  #   bitmap:restore bitmap_string ?-noname|name? 
  # ---------------------

  proc bitmap:restore {image args} \
  {
    # init cmd
    set cmd "image create bitmap"
    # set name
    switch -glob -- $args \
    {
      -non*   { }
      ""      { append cmd " [lindex $image 0]" }
      default { append cmd " $args" }
    }
    # set options
    foreach option [lindex $image 1] { append cmd " $option" }
    # create bitmap
    set img [eval $cmd]
  }

Little demo

  # ==============================
  #
  # demo
  #
  # ==============================
  
  # create a bitmap from a string
  set data "#define v_width 8\n#define v_height 4"
  append data { static unsigned char v_bits[] = { 0x18, 0x3c, 0x7e, 0xff }; }
  image create bitmap _img1_ -data $data
  # create a bitmap from a file
  set fp [open bitmap.data w]
  puts $fp $data
  close $fp
  image create bitmap _img2_ -file bitmap.data
  # save bitmaps
  set saved1 [bitmap:save _img1_]
  set saved2 [bitmap:save _img2_]
  # delete bitmaps
  image delete _img1_ _img2_
  # restore bitmaps
  bitmap:restore $saved1
  bitmap:restore $saved2
  # show them
  pack [canvas .c]
  .c create image 10 10 -image _img1_
  .c create image 30 10 -image _img2_

Screenshots Section

Serializing a bitmap screen.jpg

gold sdded pix