30 de julho de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Conversor de cores CMYK, HSV, HSL, RGB24 e RGB16

Conversor de cores CMYK

No artigo anterior mostrei como converter RGB888 para RGB565, utilizado em displays SPI RGB, de forma simples. Mas no artigo do misturador de cores CMYK tive que converter a amostra selecionada em CMYK para RGB24 e então para RGB16, para ser exibido no display. Como me baseei em um exemplo da biblioteca TFT_eSPI para fazer a interface, ficou um pouco limitada a implementação dos recursos, então iniciei a migração da interface para a biblioteca LVGL, da qual fiz já alguns vídeos, disponíveis nessa playlist. O conversor de cores CMYK era o propósito inicial, mas não resisti e implementei os demais formatos.

Na imagem de destaque estou mostrando algumas das telas da nova versão do sistema do misturador de cores, na qual faço uso de todas as conversões apresentadas no título. Mas você não precisará se preocupar com o código de conversão, pois escrevi uma biblioteca que hoje está disponível no gerenciador de bibliotecas da IDE do Arduino; a EasyColor.

Como usar a biblioteca EasyColor

Está fácil demais usá-la. Primeiramente, claro, instale-a pelo gerenciador de bibliotecas do Arduino:

Não sei se faltou indicar algum parâmetro, mas não encontrei os exemplos no menu, mas sem problemas. Acesse o diretório Arduino/libraries/EasyColor/examples e lá estarão 4 exemplos. Basicamente, fazemos isso no sketch:

#include <EasyColor.h>

EasyColor::HSVRGB hsvConverter;    //Conversão de e para HSV
EasyColor::CMYKRGB cmykConverter;  //Conversão de e para CMYK
EasyColor rgb2rgb;                 //Conversão de e para RGB888/RGB565

cmyk cmyk_st; //tipo para armazenamento de cores CMYK
rgb  rgb_st;  //tipo para armazenamento de cores RGB
hsv  hsv_st;  //tipo para armazenamento de cores HSV

void setup(){
//...ou declare os tipo onde for usar. Ex:
    rgb out_rgb;
    out_rgb.r = 220;
    out_rgb.g = 180;
    out_rgb.b = 90;

    hsv out_hsv;
    out_hsv.h = 284;
    out_hsv.s = 46;
    out_hsv.v = 60;

    rgb in_rgb;
    in_rgb.r = 200;
    in_rgb.g = 100;
    in_rgb.b = 190;

    hsv in_hsv;
    in_hsv.h = 192.94;
    in_hsv.s = 100;
    in_hsv.v = 255;

    Serial.println("Conversao HSV para RGB");
    out_rgb =  hsvConverter.HSVtoRGB(in_hsv,out_rgb);
    Serial.println(out_rgb.r);
    Serial.println(out_rgb.g);
    Serial.println(out_rgb.b);

    Serial.println("Conversao RGB para HVS");
    out_hsv = hsvConverter.RGBtoHSV(in_rgb, out_hsv);
    Serial.println(out_hsv.h);
    Serial.println(out_hsv.s);
    Serial.println(out_hsv.v);

    Serial.println("Conversao RGB888 para RGB565");
    uint16_t teste1 = rgb2rgb.RGB24toRGB16(0x80,0x80,0x00);
    Serial.println(teste1,HEX);

    Serial.println("Conversão RGB565 para RGB888");
    rgb teste3 = rgb2rgb.RGB16toRGB24(0x8400);
    Serial.println(teste3.r);
    Serial.println(teste3.g);
    Serial.println(teste3.b);
    
}

Fácil ou não?

Aplicação da biblioteca EasyColor

O conversor de cores CMYK para RGB16 é bastante útil para quem pretende fazer um misturador de cores, mas acredito que o uso mais comum será para conversão de RGB24 para RGB16 para os displays RGB SPI, como o ILI9341, vendido pela AFEletronica.

Já para o formato HSV, criei a conversão para poder utilizar com o widget da biblioteca LVGL.

Conversor de cores CMYK

Espero que a biblioteca possa lhe ser útil também. Quando essa nova interface do misturador de cores estiver concluída, farei um vídeo de apresentação e disponibilizarei o código para download.

Até a próxima!

 

Revisão Ricardo Amaral de Andrade