>  기사  >  백엔드 개발  >  C에서 이미지를 ASCII 아트로 변환할 때 강도 기반 접근 방식과 문자 피팅 접근 방식은 어떻게 다릅니까?

C에서 이미지를 ASCII 아트로 변환할 때 강도 기반 접근 방식과 문자 피팅 접근 방식은 어떻게 다릅니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-03 18:38:30677검색

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

C에서 이미지를 ASCII 아트로 변환

소개

이미지를 ASCII 아트로 변환하려면 캐릭터의 강도나 모양에 가까운 이미지를 캐릭터에 부여합니다. 이 문서에서는 C를 사용하여 이 변환에 대한 두 가지 접근 방식을 살펴봅니다.

접근 방법 1: 강도 기반 변환

  • 픽셀/영역 강도 기반(음영):

    • 이미지를 픽셀 또는 직사각형 영역(점)으로 나눕니다
    • 각 점의 평균 회색조 강도를 계산합니다
    • 각 점을 다음과 같은 강도의 문자로 바꿉니다. 계산된 강도에 가장 가깝습니다
  • 문자 맵:

    • 해당 강도가 있는 미리 계산된 문자 목록
    • 문자는 다음과 같습니다. 선형 또는 임의 분포

코드 예:

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

접근 방식 2: 문자 맞춤(하이브리드 접근 방식)

  • 비슷한 강도와 모양의 문자로 이미지 영역을 일치시키려고 합니다
  • 단계별 프로세스:

    • 이미지 분할 직사각형 영역으로
    • 여러 영역(왼쪽, 오른쪽, 위, 아래, 중앙)에서 각 영역의 강도를 계산
    • 유사한 강도 영역으로 문자 맵 만들기
    • 지도에서 가장 가까운 일치하는 문자를 입력하고 이미지 영역을 바꿉니다

코드 예:

<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.