Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah pendekatan pemadanan berasaskan intensiti dan watak berbeza dalam menukar imej kepada seni ASCII dalam C ?

Bagaimanakah pendekatan pemadanan berasaskan intensiti dan watak berbeza dalam menukar imej kepada seni ASCII dalam C ?

Patricia Arquette
Patricia Arquetteasal
2024-11-03 18:38:30735semak imbas

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

Penukaran Imej kepada Seni ASCII dalam C

Pengenalan

Menukar imej kepada seni ASCII melibatkan penukaran setiap piksel dalam imej kepada watak yang menghampiri keamatan atau bentuknya. Artikel ini meneroka dua pendekatan untuk penukaran ini menggunakan C :

Pendekatan 1: Penukaran Berasaskan Intensiti

  • Berasaskan Intensiti Pixel/Kawasan (Teduhan):

    • Membahagikan imej kepada piksel atau kawasan segi empat tepat (titik)
    • Mengira purata keamatan skala kelabu bagi setiap titik
    • Menggantikan setiap titik dengan aksara yang keamatannya paling hampir dengan keamatan yang dikira
  • Peta Watak:

    • Senarai aksara yang diprakira dengan keamatan yang sepadan
    • Watak boleh diedarkan secara linear atau sewenang-wenang

Contoh Kod:

<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>

Pendekatan 2: Pemasangan Aksara (Pendekatan Hibrid)

  • Cuba memadankan kawasan imej dengan aksara yang mempunyai keamatan dan bentuk yang serupa
  • Proses Langkah demi Langkah:

    • Bahagikan imej ke dalam kawasan segi empat tepat
    • Kira keamatan setiap kawasan dalam berbilang zon (kiri, kanan, atas, bawah, tengah)
    • Buat peta aksara dengan zon keamatan yang sama
    • Cari aksara padanan terdekat dalam peta dan gantikan kawasan imej

Contoh Kod:

<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>

Perbandingan dan Contoh :

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

Contoh intensitiContoh padanan aksara

Atas ialah kandungan terperinci Bagaimanakah pendekatan pemadanan berasaskan intensiti dan watak berbeza dalam menukar imej kepada seni ASCII dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn