2017-11-12

convert image to Arduino OLED ( Adafruit GFX Library & black white )

大概就是在做奇怪的東西哈哈,首先 imagemagick 轉圖很好用,很多詭異的格式可以轉,其中一個是 xbm (X BitMap),其實就是 xwindow 內跑 C 語言然後載到記憶體內的鬼,格式大概長這樣

#define filename_width 24
#define filename_height 24
static char filename_bits[] = {
  0xFF, 0x3F, 0xFF, 0xFF, 0xDF, 0xFE, 0xFF, 0xEF, 0xFD, 0xFF, 0xF7, 0xFB,
  0xFF, 0xF7, 0xFB, 0xFF, 0xFB, 0xFD, 0xFF, 0xFD, 0xFE, 0xFF, 0xFE, 0xFE,
  0xFF, 0xFD, 0xFD, 0xFF, 0xF3, 0xFD, 0xFF, 0xFB, 0xFE, 0xFF, 0x7B, 0xFF,
  0xFF, 0xBD, 0xFF, 0xFF, 0xDE, 0xFF, 0x7F, 0xDF, 0xFF, 0xFF, 0xBE, 0xFF,
  0xFF, 0xDE, 0xFF, 0xFF, 0xEE, 0xFF, 0x7F, 0xF7, 0xFF, 0x7F, 0xFB, 0xFF,
  0xBF, 0xFD, 0xFF, 0xBF, 0xFE, 0xFF, 0x5F, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF,
  };

因為是記憶體直接對照,所以就是 memory buffer 的格式了,其中的 filename 處為檔案名稱,會直接換成變數名稱,但如果直接出 stdout 所以該處會變成 -

這 code 其實 Arduino 中的 Adafruit GFX Library 可以直接吃了,不過需要加工一下

其中 char 要轉成 uint8_t 型態,而黑白顛倒(對 OLED 而言亮的是黑色),所以要 xor 255 也就是把整個 binary 整個反轉過,而 char 轉 uint8_t 時每個 set 都是顛倒的,要換回去才行

完成的程式長這樣,有需要的人可以拿去用哩

# [[Ruby code]]
# need imagemagick , convert all images(gif) & merge to output.txt

target = File.open('output.txt' , 'w')

filenames = Dir["*.gif"]
filenames.each do |filename|
  var_name = filename.split(/\./)[0..-2].join('_')
  content = `convert #{__dir__}/#{filename} xbm:-`

  #re-define var name & change type to uint8_t
  content.gsub!(/define \-/ , "define #{var_name}")
  content.gsub!(/static char -_bits/ , "static uint8_t #{var_name}_bits")

  #inverse color && swap bitmap buffer
  content.gsub!(/0x[\dA-F]{2}/) do |source|
    source = (source.to_i(16).to_s(2).rjust(8 , '0').reverse.to_i(2) ^ 255).to_s(16).upcase
    "0x#{"0" if source.length < 2}#{source}"
  end
  target.puts(content)
end

target.close

puts "finished , total #{filenames.length} files"

之後把 output.txt 的內容複製貼上到 IDE 內就可以直接使用了呦,超方便的哈哈

沒有留言:

張貼留言