Go: идентификационная иконка

Думаю, все видели стандартную аватарку при регистрации на Github. Но думаю не все задумывались о том, на основе чего и как она формируется.

Стандартная иконка в github

На самом деле, вы видите визуальное представление значения хэш-функции. То есть с помощью одного из алгоритмов (md5 или sha256 и т.п.) захэширован логин, при этом вывод этого алгоритма используется для генерации картинки. Поэтому идентификационная иконка будет всегда одной и тот же при одинаковых входных данных.

Фактически алгоритм генерации работает примерно так:

  • Вычисление хэш-функции от логина (результат массив байтов)
  • На основе значения хэш-функции определяем цвет изображения (например, берем первые три байта для RGB)
  • Строим результрующую сетку заданных размеров (5х5 блоков, 8х8 и т.д.), зеркалируем данные a[n-k][j] = a[k][j]
  • Закрашиваем только ячейки сетки, с нечетными значениями
  • Мапим сетку на картинку заданных размеров

На данный момент есть готовые решения для задачи построения идентификационных иконок, на языке Go существует библиотека nullrocks/identicon. С работой которой мы и познакомимся. Для начала установим ее.

go get "github.com/nullrocks/identicon"

Код программы генерации идентификационной иконки ниже.

package main

import (
  "os"

  "github.com/nullrocks/identicon"
)

func main() {

  // создаем генератор 
  ig, err := identicon.New(
    "github",  // пространство
    16,        // число блоков
    3,         // плотность
  )

  if err != nil {
    panic(err) // в случае ошибки (размер или плотность)
  }

  username := "username"      // логин пользователя

  ii, err := ig.Draw(username) // генерация иконки

  if err != nil {
    panic(err) // в случае ошибки (пустой текст)
  }

  // запись результата в файл (любой io.Writer)
  img, _ := os.Create("icon.png")
  defer img.Close()
  ii.Png(256, img) // картинка 256px на 256px
}

Результат работы программы ниже:

 

10.07.2019









 
архив

подписка