identiconpp is a library to generate identicons for C++.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
tastytea 9070f154a4
Version bump 0.7.3.
1 month ago
cmake Modernized CMake recipes and moved files around. 1 year ago
examples Modernized CMake recipes and moved files around. 1 year ago
include Install header. 1 year ago
pkg-config Modernized CMake recipes and moved files around. 1 year ago
src Added include dir for BUILD_INTERFACE. 1 year ago
tests Remove C support. 1 year ago
.drone.yml Generate package for Debian buster. 1 month ago
.editorconfig Update editorconfig. 1 month ago
.gitignore Initial commit 1 year ago
CMakeLists.txt Version bump 0.7.3. 1 month ago
CODE_OF_CONDUCT.adoc Fix coc contact. 1 year ago
CONTRIBUTING.adoc Make more use of variables in contribution guidelines. 1 year ago
Doxyfile Simplyfied doxygen config. 1 year ago
LICENSE Initial commit 1 year ago
README.adoc Generate package for Debian buster. 1 month ago
build_doc.sh Simplyfied doxygen config. 1 year ago
packages.CMakeLists.txt Fix Debian package generation. 1 month ago

README.adoc

identiconpp

identiconpp is a library to generate identicons for C++.

You get the images as Magick::Image. This allows you to make all kinds of modifications.

Example 1. Used algorithms, left to right: 4x4 ltr_symmetric, 20px padding; 5x5 sigil; 5x5 ltr_asymmetric; 6x4 ltr_symmetric, 10px padding

identicon1 identicon2 identicon3 identicon4

The example images above are generated using example.cpp.

Features

  • ✓ Symmetric identicons

  • ✓ sigil identicons

  • ✓ Asymmetric identicons

  • ✓ Padding

Usage

The HTML reference can be generated with build_doc.sh, if doxygen is installed. It is also available at doc.schlomp.space/identiconpp/.

You need to generate hashes yourself, any hexadecimal string will do. Make sure to use a safe hashing algorithm for sensitive data (not MD5). You can select as many columns and rows as you like, but make sure you have enough entropy. If something seems to be wrong, exceptions will be thrown.

The "sigil" algorithm generates the same results as sigil and pydenticon.

Example

// Compile with g++ $(pkg-config --libs --cflags identiconpp)
#include <iostream>
#include <identiconpp.hpp>
#include <Magick++/Image.h>

int main()
{
    Identiconpp identicon(5, 5, Identiconpp::algorithm::ltr_symmetric,
                          "ffffff80", { "800000ff" }, { 10, 10 });
    Magick::Image img;
    img = identicon.generate("55502f40dc8b7c769880b10874abc9d0", 200);
    img.write("identicon.png");

    std::cout << identicon.generate_base64("png", "5550", 200) << std::endl;
}

Install

Gentoo

Gentoo ebuilds are available via my repository.

Automatically generated packages

Binary packages are generated automatically for each release. They are signed with my automatic signing key.

From source

Dependencies

On a Debian system, install the packages: build-essential cmake libmagick++-dev.

Compile

mkdir build
cd build
cmake ..
cmake --build .
make install
cmake options:
  • -DCMAKE_BUILD_TYPE=Debug for a debug build

  • -DWITH_TESTS=YES to build tests

  • One of:

    • -DWITH_DEB=YES to generate a deb-package

    • -DWITH_RPM=YES to generate an rpm-package

To generate a binary package, run make package.

How to contribute

Read the Code of Conduct.

Reporting bugs or suggesting enhancements

Before reporting a bug, please perform a search to see if the problem has already been reported. If it has, add a comment to the existing issue instead of opening a new one. Same for enhancements.

You can also contact me via E-Mail, XMPP or the Fediverse if you don’t want to open an account.

Pull requests

Please use similar coding conventions as the rest of the project. The basic rule to remember is to write code in the same style as the existing/surrounding code.

You can also send me your patches via E-Mail, ideally using git format-patch or git send-email.

Algorithms

ltr_symmetric

  • Create image with width=columns, height=rows.

  • Set background color.

  • Select half of the columns, or half of the columns + 1 if uneven.

    • columns / 2 + columns % 2

  • Pixels are drawn from left to right, top to bottom.

  • Use bits from digest to determine if a pixel is painted(1) or not(0).

  • Mirror the pixels vertically.

  • Use the following bits to pick the foreground color.

    • You need floor(log2(n_colors)) + 1 bits.

  • Scale image proportionally to requested width.

 0111 0011 1101 1100 […] 1111 0111 0101 0111
^                            ^
+----------------------------+-------------->
             |                      |
        pixel matrix        foreground color

Implemented in ltr_symmetric.cpp.

ltr_asymmetric

  • Create image with width=columns, height=rows.

  • Set background color.

  • Pixels are drawn from left to right, top to bottom.

  • Use bits from digest to determine if a pixel is painted(1) or not(0).

  • Use the following bits to pick the foreground color.

    • You need floor(log2(n_colors)) + 1 bits.

  • Scale image proportionally to requested width.

 0111 0011 1101 1100 […] 1111 0111 0101 0111
^                            ^
+----------------------------+-------------->
             |                      |
        pixel matrix        foreground color

Implemented in ltr_asymmetric.cpp.

sigil

  • Create image with width=columns, height=rows.

  • Set background color.

  • Select half of the columns, or half of the columns + 1 if uneven.

    • columns / 2 + columns % 2

  • Pixels are drawn from top to bottom, left to right.

  • Use the first 8 bits to pick the foreground color.

  • Use the following bits to determine if a pixel is painted(1) or not(0).

  • Mirror the pixels vertically.

  • Scale image proportionally to requested width.

 0111 0011 1101 1100
^         ^
+---------+--------->
     |            |
foreground color  |
             pixel matrix

Implemented in sigil.cpp.