[질문]ImageMagick, gd library에 관한 질문입니다.

paraline의 이미지

안녕하세요?

지난번에 이미지 프로세싱에 관한 질문을 올렸던 사람입니다.
제 질문에 대한 답변이나 다른 글에 대한 답변을 참조해서, gd library와 ImageMagick에 대해서 조사를 했습니다.

ImageMagick이 기능이 많아서인지 제 프로젝트에는 맞는것 같더군요.
그런데, gd library나 ImageMagick에서 이미지에 텍스트를 입힐경우, 기본적인건 다 되는데, 폰트 스타일(Italic, Bold, Underline)을 세세하게 설정하는 방법을 모르겠습니다.

gd library 자체에서는 지원이 안되는것 같고, freetype에서 바꿔줘야 할것 같은데, freetype에서 폰트를 바꿔서 gd library에서 이용하는 방법을 찾을수가 없습니다.

그리고, ImageMagick에서도 Image class에 보면 type이라는 attributes가 있긴한데, 이건 파라미터가 ImageType이라서 다른 설정을 줄수가 없네요.

혹시라도 사용해보신 분이 계시다면 도움을 좀 주시기 바랍니다.
샘플소스도 보고, 안되는 영어에 여기저기 찾아봤지만, 답을 찾기가 어렵습니다.

아, 그리고, 몇가지 더 여쭙겠습니다.
gd library에서 한글 텍스트를 입력하면 글자가 깨져서 나오던데, 그래서, iconv도 해봤는데, 제대로 안되더군요.
제가 궁금한건, 기본적으로 char *pText = "안녕"; 이라고 할경우, 이건 ASCII 코드일것 같은데, 그러면, ASCII에서 UTF-8로 바로 바꿔서 사용하는건가요? 아니면, 중간에 다른 과정이 필요한가요?
제가 유니코드에 대한 개념이 부족해서 그런것 같은데, 조언 주시면 감사하겠습니다.

제가 산돌광수체로 텍스트 입히는걸 테스트 해봤는데, gd library를 쓸때는 한글은 깨져서 나오지만, 영문은 잘 나옵니다.
그런데, ImageMagick에서는 산돌광수체를 쓰면 영어고 한글이고 아예 글자가 안나오는군요. 테스트는 윈도에서 Visual C++ 6.0으로 했습니다.
나중에 실제 개발은 솔라리스에서 할 예정입니다.

시스템에 있는 폰트중 사용자가 선택하는 폰트를 입힐 생각인데, 이렇게 안나오는 경우에는 폰트를 다시 만들어야 하는건지 감이 안잡히네요.

몇일째 씨름하다 답답한 마음에 두서없는 질문을 올립니다.
나무라지 마시고, 좋은 답변 많이 주세요.

답변주실 모든 분들께 미리 감사의 말씀 전합니다.

정태영의 이미지

편집기에서 어떤 charset으로 저장했는지가 중요하겠죠..
euc-kr이나 cp949로 저장했으면.. iconv로 UTF-8로 변환하는 과정이 필요하겠네요..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

vinus의 이미지

gd에서 한글을 사용하려고 전에 노력한 적이 있어서 몇자 적어 봅니다.

그때 했어던 행동은 좀 무식한 방법 이었지만....

제가 출력해야하는 문자는 UTF-8이었습니다. 그리고 물론 지금 고민하시는 2byte문자 였습니다.
다행 스러운 것은 그 당시 필요 했던 글자 들이 많지 않았던 관계로... 별도의 폰트테이블을 정의 했었습니다.

즉 UTF-8로 인덱싱 되는 테이블을 만들고 필요한 글자를 폰트 (도트 폰트 )형식으로 저장을 해서 불러 쓰는 형식이었지요. 사실 폰트야 그렇게 이쁘지 않았지만서두.. 여튼 이런 삽질을 했었던 경험이 있지요...

폰트에 대해서 좀더 자세히 공부 했더라면, 아마 UNIX의 다른 폰트들을 불러 쓸수 있지 않았을까 하고 반성해 봅니다.

>>>행복한 웃음<<<

paraline의 이미지

정태영 wrote:
편집기에서 어떤 charset으로 저장했는지가 중요하겠죠..
euc-kr이나 cp949로 저장했으면.. iconv로 UTF-8로 변환하는 과정이 필요하겠네요..

편집기의 charset이 euc-kr로 되어 있다면, 그냥 char *p="안녕" 이렇게 해도 이게 euc-kr로 저장이 되는건가요? 그리고, 한글이 아닌 영문의 경우도 마찬가지인가요? char *p="test" 이런 경우에는 유니코드인지 아스키인지 모르겠네요.
유니코드에 대해 참조할만한 책이나 사이트 좀 추천해 주시면 감사하겠습니다.

좌절금지!!!
피할수 없다면 즐겨라.

paraline의 이미지

vinus wrote:
gd에서 한글을 사용하려고 전에 노력한 적이 있어서 몇자 적어 봅니다.

그때 했어던 행동은 좀 무식한 방법 이었지만....

제가 출력해야하는 문자는 UTF-8이었습니다. 그리고 물론 지금 고민하시는 2byte문자 였습니다.
다행 스러운 것은 그 당시 필요 했던 글자 들이 많지 않았던 관계로... 별도의 폰트테이블을 정의 했었습니다.

즉 UTF-8로 인덱싱 되는 테이블을 만들고 필요한 글자를 폰트 (도트 폰트 )형식으로 저장을 해서 불러 쓰는 형식이었지요. 사실 폰트야 그렇게 이쁘지 않았지만서두.. 여튼 이런 삽질을 했었던 경험이 있지요...

폰트에 대해서 좀더 자세히 공부 했더라면, 아마 UNIX의 다른 폰트들을 불러 쓸수 있지 않았을까 하고 반성해 봅니다.


아직은 제가 솔라리스에서 테스트를 못해본 관계로 정확한 질문을 드리기가 어렵지만, 윈도에서 테스트한 결과로는 gd library를 사용했을 경우, "산돌광수"체 같은 경우 영문은 제대로 나오지만, 한글은 깨져서 나왔고(아마도 encoding 문제인것 같습니다만...), ImageMagick을 사용했을 경우, "산돌광수"체의 경우, 아예 글씨가 안보입니다(영문, 한글 상관없이).
이렇게 글씨 자체가 안보이는 경우, 보이게끔 폰트를 다시 만들어야 하는지, 아니면, 뭔가 다른 방법(OS 자체의 환경 설정이라던가, 기타...)을 통해서도 가능한지요?
그리고, 폰트의 스타일을 설정하는 방법(프로그램상으로)을 도무지 찾을수가 없는데, 만약 라이브러리에서 bold나 italic등을 지원하지 않는다면, 폰트를 bold용과 italic용으로 따로 만들어서 사용해야 하는건가요?
질문이 참 막연한것 같아서 죄송한 마음을 금할수 없지만, 아는게 없으니 질문도 똑똑하게 못하겠네요. ㅠ.ㅠ

좌절금지!!!
피할수 없다면 즐겨라.

vinus의 이미지

글세요..

별로 도움이 될것 같지는 안지만...
당시 작업당시 gd를 이용하여 font를 출력하는 함수를 만들었습니다. 물론 제가 만든 폰트(?)파일을 출력하는 것이었으니까, 어쩔 수 없었고, 그리고 다른 라이버러리나 자료를 찾는 것보다는 빠르게 작업을 진행할 수 있겠다고 생각 했기때문입니다.

정확한지 아닌지는 잘모르지만...
2byte용의 문자 출력 함수가 별도로 존재 할겁니다.
저기서 한글이 깨진다는 것은 EUC코드 같은 2byte를 출력 할 경우, 각각의 바이트를 영문 한바이트 0x00-0xFF사이의 한바이트로 대치시키기 때문에 발생 하는 문제가 아닌가 생각 됩니다.그래서 총 영문 2바이트가 출력될 것이고, 결과적으로 글자는 깨지는 것이라고 추정 합니다.
만약 UTF-8을 출력 한다면, 경우에따라 다르지만.. 한글 한 글자에 3byte 혹은 4byte등등이 출력 될 수 있습니다.

별로 도움이 되지 못하는 것 같군요...

>>>행복한 웃음<<<

정태영의 이미지

paraline wrote:
아직은 제가 솔라리스에서 테스트를 못해본 관계로 정확한 질문을 드리기가 어렵지만, 윈도에서 테스트한 결과로는 gd library를 사용했을 경우, "산돌광수"체 같은 경우 영문은 제대로 나오지만, 한글은 깨져서 나왔고(아마도 encoding 문제인것 같습니다만...), ImageMagick을 사용했을 경우, "산돌광수"체의 경우, 아예 글씨가 안보입니다(영문, 한글 상관없이).
이렇게 글씨 자체가 안보이는 경우, 보이게끔 폰트를 다시 만들어야 하는지, 아니면, 뭔가 다른 방법(OS 자체의 환경 설정이라던가, 기타...)을 통해서도 가능한지요?

ImageMagick 은 사용해본 적이 없어서 뭐라고 말씀드릴 수 없지만..
gd의 경우는.. 인코딩이 iso10646 으로 된 트루타입 폰트만을 사용가능합니다.. ksc5601(완성형) 같은 인코딩만 들어있으면 한글영역은 제대로 그려주지 못한단 얘기입니다 :)

fontforge로 열어서.. 인코딩만 iso10646으로 바꿔주고 다시 generate font 하면 대부분 해결됩니다 :D

그리고 freetype 문서를 찾아보니.. 아래와 같은 게 있는걸로 보아 구지 이탤릭이나볼드 폰트를 쓰지 않고도 쓸 수 있는 방법은 있을거 같지만..

gd에서 아직 지원하지 않는 듯 보이므로.. 직접 해킹해야 될듯 하군요 ..

http://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#FT_STYLE_FLAG_XXX

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.