[완료]Freetype 라이브러리 이용해서 1bit bitmap 이미지를 찍어주고 싶습니다.

eyecleaner의 이미지

Freetype 라이브러리에서

bitmap 타입을 mono로 설정 했을때
bitmap 변수에 어떻게 데이터가 들어가 있는지 궁굼합니다.

API 레퍼런스를 찾아보면
FT_Bitmap 구조체를 보면 pixel_mode 라고 있는데
이 속성 값들 중에 또 FT_PIXEL_MODE_MONO 라고 정의 되어 있습니다.

A monochrome bitmap, using 1 bit per pixel.
Note that pixels are stored in most-significant order(MSB),
which means that the left-most pixel in a byte has value 128.

이라고 설명 되어 있는데 무슨 의미 이해가 잘 안됩니다.

bitmap 변수에 data 가 10110011 라고 들어가 있으면
1bit 로 뽑아낸 data기 때문에 각 bit 가 1 pixel 이 되어서

10000000
00000000
10000000
10000000
00000000
10000000
10000000

이렇게 각 pixel(bit) 를 1byte 로 만들어줘서
비트맵을 만들어야 하나요?

아니면 다른 속성을 만져줘야 하는지요...
Freetype 라이브러리를 이용해서 1bit bitmap 이미지로 출력하고 싶습니다.

chadr의 이미지

아닙니다. 올려주신 영어로 된 설명이 정확하게 나와있습니다.

MONO로 뽑은 비트맵 데이터는 각 픽셀이 1비트에 대응됩니다.
따라서 폰트 비트맵 크기가 3*3의 경우에는 아래와 같은 형식이 됩니다.

101 100 010

편의상 3비트씩 쪼갰습니다. 그냥 일련의 비트연속이라 보시면 됩니다.

하지만 우리가 익히 아는 1바이트는 8비트이므로 실제로는 아래와 같이 저장 되어있을 겁니다.

10110001 00000000

이것을 그냥 일련의 비트연속으로 보시고 FT_Bitmap의 rows, width, pitch를 이용해서 풀어내야하는 것입니다.

비트맵에서 rows, width, pitch의 의미는 검색해보면 아실겁니다.

아래는 MONO와 MONO가 아닌 경우 비트맵을 풀어내는 코드입니다.

  void
    DCFontGlyph::CopyFromFTGlyph(FT_Bitmap *pbitmap)
  {
    BITMAP &glyph = this->m_Bitmap[DCFont::TEXTURE_CACHE_NORMAL];
 
    this->AllocBitmap(glyph, pbitmap->rows, pbitmap->width);
 
    for (int j = 0; j < pbitmap->rows; j++)
    {
      unsigned char *src = pbitmap->buffer + (j * pbitmap->pitch);
 
      for (int k = 0; k < pbitmap->width; k++)
      {
        int bufferIndex = k + pbitmap->width * j;
 
        if (pbitmap->pixel_mode == FT_PIXEL_MODE_MONO)
        {
          int shift = k & 7;
          int index = k / 8;
 
          //0x80(1000 0000) : 이를 이용하여 마스크비트를 오른쪽을 하나씩 이동하면서
          //비트가 세팅되어있는지 확인하여 데이터를 확인한다.
          glyph.pBitmap[bufferIndex] = (src"["index"]" & (0x80 >> shift)) ? 0xff : 0x00;
 
        }
        else
        {
          glyph.pBitmap[bufferIndex] = src[k];
 
        }
 
      }
 
    }
 
  }

위 코드를 보시면 아시겠지만 MONO의 경우에는 각 비트를 하나씩 풀어서 분리하는 부분이 있고
그렇지 않는 경우에는 그냥 8비트 단위로 데이터를 분리해고 있습니다.

ps. 위의 코드에서 src"["index"]"라고 되어있는 부분은 따옴표를 제거하고 그냥 올리니까 이 부분이 깨지네요.
그래서 따옴표로 감쌌습니다. 원래 코드는 따옴표를 제거한 배열 접근 부분이라고 보시면 됩니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

eyecleaner의 이미지

덕분에 꽉 막혔었는데 쉽게 해결 할수 있었습니다.
출력이 되긴 하는데 1bit 라 그런지 모양이 이쁘지는 않네요 ^^
좀 더 공부해 봐야 겠네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.