Maison  >  Article  >  développement back-end  >  En quoi les approches basées sur l'intensité et l'ajustement des caractères diffèrent-elles dans la conversion d'images en art ASCII en C ?

En quoi les approches basées sur l'intensité et l'ajustement des caractères diffèrent-elles dans la conversion d'images en art ASCII en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-03 18:38:30677parcourir

How do intensity-based and character fitting approaches differ in converting images to ASCII art in C  ?

Conversion d'image en art ASCII en C

Introduction

La conversion d'une image en art ASCII implique la conversion de chaque pixel du image à un personnage qui se rapproche de son intensité ou de sa forme. Cet article explore deux approches pour cette conversion en utilisant C :

Approche 1 : Conversion basée sur l'intensité

  • Basée sur l'intensité des pixels/zones (ombrage) :

    • Divise l'image en pixels ou zones rectangulaires (points)
    • Calcule l'intensité moyenne de l'échelle de gris de chaque point
    • Remplace chaque point par un caractère dont l'intensité est le plus proche de l'intensité calculée
  • Carte des caractères :

    • Liste précalculée des caractères avec leurs intensités correspondantes
    • Les personnages peuvent être distribué linéairement ou arbitrairement

Exemple de code :

<code class="c++">AnsiString m = ".,:;ox%#@&";
for (int y = 0; y < bmp->Height; y++) {
    for (int x = 0; x < bmp->Width; x++) {
        int i = (p[x + x + x + 0] + p[x + x + x + 1] + p[x + x + x + 2]) / 3;
        i = (i * m.Length()) / 768;
        s += m[m.Length() - i];
    }
    s += endl;
}</code>

Approche 2 : Ajustement des caractères (approche hybride)

  • Essaye de faire correspondre les zones d'image avec des caractères d'intensité et de forme similaires
  • Processus étape par étape :

    • Diviser l'image en zones rectangulaires
    • Calculez l'intensité de chaque zone dans plusieurs zones (gauche, droite, haut, bas, centre)
    • Créez une carte de caractères avec des zones d'intensité similaires
    • Trouvez le caractère correspondant le plus proche dans la carte et remplacer la zone d'image

Exemple de code :

<code class="c++">int xs, ys, xf, yf, x, xx, y, yy;
int i, i0, d, d0;
DWORD **p = NULL, **q = NULL;

for (;;) { // Dynamic allocation error handling
    // Font Properties
    xf = font->Size;   if (xf < 0) xf = - xf;
    yf = font->Height; if (yf < 0) yf = - yf;

    // Character Map
    for (x = 0, d = 32; d < 128; d++, x++) {
        map[x].c = char(DWORD(d));
        tmp->Canvas->TextOutA(0, 0, map[x].c);
        map[x].compute(q, xf, yf, 0, 0);
    }

    // Main Loop
    xf -= xf / 3;
    xs -= xs % xf;
    ys -= ys % yf;
    for (y = 0; y < ys; y += yf, txt += eol)
        for (x = 0; x < xs; x += xf) {
            gfx.compute(p, xf, yf, x, y);
            i0 = 0; d0 = -1;
            for (i = 0; map[i].c; i++) {
                d = abs(map[i].il - gfx.il) +
                    abs(map[i].ir - gfx.ir) +
                    abs(map[i].iu - gfx.iu) +
                    abs(map[i].id - gfx.id) +
                    abs(map[i].ic - gfx.ic);
                if ((d0 < 0) || (d0 > d)) {
                    d0 = d; i0 = i;
                }
            }
            txt += map[i0].c;
        }
    break;
}</code>

Comparaison et exemple :

Approach Advantage Disadvantage
Intensity-Based Simple, Fast Limited Visual Appeal
Character Fitting Higher Quality Output Slower Processing

Exemple d'intensitéExemple d'ajustement de caractère

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn