소개
이미지를 ASCII 아트로 변환하려면 캐릭터의 강도나 모양에 가까운 이미지를 캐릭터에 부여합니다. 이 문서에서는 C를 사용하여 이 변환에 대한 두 가지 접근 방식을 살펴봅니다.
픽셀/영역 강도 기반(음영):
문자 맵:
코드 예:
<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>
단계별 프로세스:
코드 예:
<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>
비교 및 예 :
Approach | Advantage | Disadvantage |
---|---|---|
Intensity-Based | Simple, Fast | Limited Visual Appeal |
Character Fitting | Higher Quality Output | Slower Processing |
위 내용은 C에서 이미지를 ASCII 아트로 변환할 때 강도 기반 접근 방식과 문자 피팅 접근 방식은 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!