HiSilicon OSD anti-aliasing, transparencia de fondo y marca de agua superpuesta

prefacio

El uso de chips HiSilicon para superponer OSD se introdujo en el artículo anterior. El método de uso básico no se presentará nuevamente. Este artículo presenta el uso de OSD anti-aliasing y transparencia de fondo. Debe adaptarlo de acuerdo con su propio modelo de chip. Espero que sea útil para todos. Si tiene alguna pregunta, puede dejar un mensaje a continuación para discutir.

1. Fondo transparente

(1) Al crear RGN, puede configurar el color de fondo y la transparencia. Compruebe si el modelo SDK admite la configuración del color de fondo. Esto no parece funcionar cuando se usa junto con la biblioteca SDL TTF. Los estudiantes que usan fuentes de matriz de puntos pueden Pruébalo, no sé si tendrá algún efecto.

Configuración del parámetro u32BgColor, la imagen a continuación es un ejemplo implementado en el blog original "HiSilicon 3516a implementa una marca de agua superpuesta OSD" . De acuerdo con la descripción en el SDK de HiSilicon, simplemente configure la transparencia y el color del fondo.
Insertar descripción de la imagen aquí

(2) Cuando utilice las bibliotecas de código abierto SDL y TTF_SDL, configure la interfaz de color de marca de agua para evitar el uso de la interfaz TTF_RenderUTF8_Shaded. Esta interfaz provocará una sombra detrás de la fuente. A menos que este efecto de sombra sea necesario, la interfaz TTF_RenderUTF8_Solid puede generar el efecto que usted Quiero. Este artículo 2. La versión de la biblioteca SDL utilizada en este artículo es más nueva que la original y la interfaz ha cambiado. Finalmente, se adjuntará un enlace a la biblioteca SDL que utilicé. El fondo del flujo de imágenes generado es transparente y se puede guardar como una imagen en formato bmp para ver el efecto.

//保存为bmp格式图片
SDL_SaveBMP(temp, "save.bmp");
//设置字体颜色
SDL_Color forecol = {
    
     0x00, 0xff, 0xff, 0xff };
text = TTF_RenderUTF8_Solid(font, pstr, forecol);

2. Utilice modos de fusión para eliminar el alias


El método para eliminar el alias utiliza principalmente el método TTF_RenderUTF8_Blended en la biblioteca de código abierto.
Esta interfaz utiliza el modo de fusión para crear una superficie ARGB de 32 bits y renderizar el texto dado con alta calidad, usando fusión alfa para difuminar la fuente con un color determinado.


int main(int argc, const char *argv[])
{
    
    
    char pstr[128] = {
    
    0};
    snprintf(pstr, 128, "%s","我爱中国(wo ai zhong guo)");.

    SDL_PixelFormat *fmt;
    TTF_Font *font;
    SDL_Surface *text, *temp;
    if (TTF_Init() < 0 )
    {
    
    
        fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());
        SDL_Quit();
    }
    font = TTF_OpenFont(FONT_TTF_PATH, 48);
    if ( font == NULL )
    {
    
    
        fprintf(stderr, "Couldn't load %d pt font from %s: %s\n",18,"ptsize", SDL_GetError());
    }
    SDL_Color forecol = {
    
     0x00, 0xff, 0xff, 0xff };

    text = TTF_RenderUTF8_Blended(font, pstr, forecol);
    printf("h:%d, w:%d, text len:%d\n", text->h, text->w, strlen((char*)text->pixels));
    
    fmt = (SDL_PixelFormat*)malloc(sizeof(SDL_PixelFormat));
    memset(fmt,0,sizeof(SDL_PixelFormat));
    fmt->BitsPerPixel = 32; //每像素位数
    fmt->BytesPerPixel = 4; //每像素字节数
    fmt->format = SDL_PIXELFORMAT_ARGB8888;
    fmt->Amask = 0xFF000000;    //透明度分量
    fmt->Rmask = 0x00FF0000;    //红色分量
    fmt->Gmask = 0x0000FF00;    //绿色分量
    fmt->Bmask = 0x000000FF;    //蓝色分量

    temp = SDL_ConvertSurface(text,fmt,0);
   
    SDL_SaveBMP(temp, "argb8888.bmp");
    free(fmt);
    fmt = NULL;
    SDL_FreeSurface(text);
    SDL_FreeSurface(temp);
    TTF_CloseFont(font);
    TTF_Quit();
    return 0;
}

Cuando se utiliza el modo de fusión, es necesario establecer algunos parámetros, ¡lo más importante! De lo contrario, se generará una barra rectangular de color sólido y la fuente no será visible.
(1) fmt->BitsPerPixel: este parámetro es el número de bits por píxel y ARGB8888 tiene 32 bits por píxel.
(2) fmt->BytesPerPixel: este parámetro es el número de bytes por píxel, establecido en 4.

Insertar descripción de la imagen aquí
La imagen de arriba muestra los elementos de la enumeración SDL_PixelFormatEnum. Los amarillos son la configuración de los dos parámetros BitsPerPixel y BytesPerPixel. Para encontrar los parámetros correspondientes según el formato utilizado, puede consultar este lugar.
(3) fmt->formato: el formato es SDL_PIXELFORMAT_ARGB8888.
(4) La configuración del componente ARGB se puede configurar de acuerdo con el código anterior.

Las imágenes generadas son las siguientes: la de arriba se genera usando el modo de fusión y la siguiente se genera usando el modo sólido. Se puede ver que la superficie de la fuente generada usando el modo de fusión es suave y completa, y la uno generado usando el modo sólido es irregular.
Insertar descripción de la imagen aquí

Usando el modo de fusión, puede ver que es una superficie ARGB de 32 bits en el formato ARGB8888. Entonces, si usa un chip HISI, debe verificar si el chip admite este formato:
[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-6X00Qox7-1663235448305)(en-resource://database/520:0) ]

De lo contrario, se informará un error al crear RGN:
[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-yhNUmzBj-1663235448306)(en-resource://database/522:0) ]
si no es compatible, aún use el modo suelo y use el formato SDL_PIXELFORMAT_ARGB1555. Básicamente, todos los chips admiten este formato y aún no se ha encontrado un método mejor.
Los amigos que admitan el formato ARGB8888 pueden probarlo, gracias.

Enlace de datos

Paquetes de código abierto (freetype, SDL, SDL_TTF) utilizados en la nueva versión de la marca de agua OSD
Artículo anterior "HiSilicon 3516a implementa la marca de agua superpuesta OSD"

Supongo que te gusta

Origin blog.csdn.net/weixin_37926485/article/details/126876468
Recomendado
Clasificación