2011-04-21 2 views
4

는 :크기 11의 내 TrueType 글꼴이 Windows와 다른 이유는 무엇입니까? 재치으로

original http://i53.tinypic.com/200skuv.png

은 다음 파이썬 코드는 다음과 같습니다 메모장이 열립니다 "굴림, 크기 11"로 선정 글꼴, 단어, 찍은 스크린 샷을주의 깊게 입력 "이것은 단지 테스트입니다" 입력 및 실행

import ImageFont, ImageDraw, Image 
im = Image.open("c:/textimg.png") #the above image 

pilfont = ImageFont.truetype("arial.ttf", 11) 

compimg = Image.new("RGB", im.size, (255, 255, 255)) 
draw = ImageDraw.Draw(compimg) 

draw.text((0,0), "this is just a test", (0,0,0), font=pilfont) 

compimg.save("c:/compimg.png") 

을하지만 결과는 실망 다릅니다

sad http://i56.tinypic.com/9h7x55.png

크기가 잘못되었을뿐만 아니라 약간 음영이 나타나는 반면 메모장 렌더링은 선명하고 픽셀 경계를 넘지 않습니다.

메모장처럼 렌더링하려면 어떻게해야합니까? 파이 게임에 대해서도 정확한 문제가 있었으므로 여기서 TTF에 대한 근본적인 이해가 빠져 있다고 생각합니다.

업데이트 : 파이 게임으로 다시 시도했습니다. 그것은 똑같은 일을합니다. 앤티 앨리어싱을 해제 할 수있는 옵션이 있지만 일부 임계 값을 기준으로 앤티 앨리어싱을 적용한 모든 픽셀을 제거하는 것처럼 보입니다. 나는 사이즈 15을 사용했다 가지고 가장 가까운 근사치는 코드이었다

pygfont = pygame.font.Font(r"c:\windows\fonts\arial.ttf", 15) 
surf = pygfont.render("this is just a test", False, (0,0,0), (255,255,255)) 
pygame.image.save(surf, r"c:\pygameimg.png") 

및 결과 (비교를 위해 위에 메모장 원본) :

KILL ME http://i56.tinypic.com/2r26mbs.png

GAH 나는를 제공 할 수없는 이유 현상금?

UPDATE : 여기에 비교있어 모든 메소드 :

AIFEOIFEF http://i56.tinypic.com/51ybtg.png

PIL (15), 메모장 (11)는, 다음 다음 15 앤티 앨리어싱 오프 파이 게임 (15) 앤티 앨리어싱 기능을 파이 게임.

실제로 PIL 15는 적절한 비율을 가지고 있습니다. 단지 안티 앨리어싱 처리 된 것입니다. 왜 15 대 11 대? 창문과 같은 방식으로 만드는 법? (그리고 wtf는 파이 게임 중입니까?)

+0

이미지가 다운되었으므로 링크를 업데이트 할 수 있습니까? – shuttle87

답변

4

글꼴 렌더링은 복잡하고 미묘한 과정이며 여러 번 구현되었습니다. PIL과 Windows는 전혀 다른 글꼴 렌더링 엔진을 사용하기 때문에 모양이 다릅니다. Windows는 기본 제공 렌더링을 사용하며 PIL은 컴파일 된 Freetype을 사용합니다.

각 환경이 "크기"매개 변수를 해석하는 방법을 모르지만, 해석이 같아도 렌더링이 간단합니다. 메모장과 동일한 픽셀을 얻는 방법은 메모장을 실행하고 화면을 잡는 것입니다.

왜 메모장과 동일한 렌더링을 원하는지 더 자세히 설명하면 문제에 대한 창의적인 해결책을 찾을 수 있습니다.

+0

거기에 파이썬에서 Windows의 방법을 사용하여 렌더링하는 방법은 무엇입니까? 내가 메모장과 같은 것을 렌더링하고자하는 이유는 프로그램이 어떤 글꼴을 사용하고 있는지 자동으로 감지하기를 원하기 때문입니다. 나는 단순한 앤티 앨리어스가 적용되지 않은 렌더링을 사용하는 경우에만 그 기능을 사용할 수 있기를 기대할 수 있습니다. 필자는 페인트/메모장을 사용하여 스크린 샷과 비교하여 손으로 매치를 성공시킬 수 있었으므로이를 모방하려고했습니다. – Claudiu

+0

실제로 플래시를 사용하는 프로그램이 많기 때문에 플래시 글꼴을 렌더링하는 방법을 찾을 수 있다면 달콤한 글꼴이 될 것입니다. – Claudiu

+0

PIL의 알고리즘을 지적 해 주셔서 감사합니다. 나는 글꼴 렌더링에 대해 내가 아는 것보다 더 많이 배우고있다. – Claudiu

1

메모장의 "크기"는 포인트 크기이고 ImageFont.truetype()의 "크기"는 픽셀이라고 생각합니다.

+0

및 .. 내가 그것에 대해 할 수있는 모든 것? 내가 메모장과 동일하게 렌더링하고 싶습니다. 특히 안티 앨리어싱이 일어나기도합니다. – Claudiu

+0

나는 이것이 사실이라는 것도 잘 모릅니다. 메모장에서 'h'의 높이는 11이고 PIL에서는 'h'의 높이가 7 또는 8-ish입니다. – Claudiu

1

크기가 다르기 때문에 크기가 다르게 나타납니다. 점을 픽셀로 변환하려면 다음 공식을 사용하십시오. pixels = points * 96/72 여기서 96은 모니터의 실제 DPI가 아닌 Windows에 구성된 DPI입니다. 귀하의 경우, 11 * 96/72 = 14.6666, 15로 반올림됩니다.

텍스트 용 픽셀 픽셀을 동일하게 만드는 것은 제공된 도구로는 불가능합니다. Ned is correct. 이것이 절대적으로 중요하다면 Windows API를 사용하여이 텍스트를 렌더링하고 이미지에 복사해야합니다. 간단한 과정이 아닙니다.

+0

흠 나는 텍스트를 렌더링하기 위해 winapi를 사용하여 어디에서 시작할 수 있는지에 대한 포인터를 줄 수 있는가? – Claudiu

1

성공 - 레드 라인을보고 :

praise the lord http://i54.tinypic.com/2r60dc3.png

내가 here 만든 방법을 사용.

> 0 : 글꼴 매퍼 변환

흥미롭게도, 난 여전히 문서가 말한대로,이 있지만, 관련 픽셀 대 지점 인 경우 잘 모르겠어요 글꼴 크기 (15)를 공급했다 이 값을 장치 단위로 입력하고 셀 높이의 사용 가능한 글꼴과 일치시킵니다.

< 0 : 글꼴 매퍼는이 값을 장치 단위로 변환하고 사용 가능한 글꼴의 문자의 문자에 대해 절대 값을 일치시킵니다.

그러나 -11을 입력하면 원하는 결과를 얻지 못했습니다 ... 단지 작게 만들었으므로 단서가 없습니다. 아마 픽셀 대 포인트입니다.

1

Ned가 이미 지적했듯이 일부 렌더링 라이브러리에서 동일한 결과를 얻으려고 시도하는 것은 적절하지 않습니다. 정확히 동일한 네이티브 모양을 원한다면 Windows의 내부 기능을 사용하려고합니다. 이는 다른 게시물에서 볼 수있는 것처럼 이미 완료 한 것이며 매우 흥미 롭습니다.

화면에 대해 사실적인 텍스트 렌더링을 일반적으로 이야기하면 다소 뉘앙스가 있습니다. 첫째, 모든 벡터 폰트 포맷은 초기에는 화면 용으로 개발 된 것이 아니라 단순히 타이포그래피 용이며 두 가지 큰 차이점이 있습니다. 화면에는 비트 맵, 즉 8 비트 알파 채널 정보 만 있으면 픽셀 값과 함께 화면 배경과 혼합됩니다. TTF 파일을 문자 그대로 비트 맵 세트로 추출해야 작업을 수행 할 수 있습니다. BW (1 비트)의 높은 해상도에서

  • 추출 문양 :

    그리고 여기에 대략 말하기, 이동하는 방법은 두 가지입니다. 예 : ~ 600px 비트 맵으로 대부분의 경우 충분합니다. 그런 다음 필요에 따라 문자열을 구성하고 크기를 조정할 수 있습니다.

  • 8 비트 배열로 대상 해상도로 직접 추출합니다. 이 경우에는 크기를 조정할 수 없지만 단순히이 8 비트 배열을 알파 채널에 넣고 선을 따라 배치하면됩니다.

정확한 거리 목록과 커닝 쌍 목록이 필요합니다. 각 대상 해상도마다 분명히 다르며이 정보를 추출하는 것은 다양한 글꼴 형식에 따라 다를 수 있습니다.

두 번째 방법은 고해상도 비트 맵에서도 달성 할 수 있으므로 매번 래스터화할 필요가 없기 때문에 첫 번째 단계를 고수하는 것이 좋습니다. 거리 정확도를 높이기 위해 작은 크기의 경우 동일한 글리프를 의미하지만 초기 고해상도 이미지에서 1/2 또는 1/3 픽셀로 이동하는 "시프트 된"글리프를 생성 할 수도 있습니다. 이것은 약간 다른 문자열 구성 절차를 다시 요구합니다.

중요 크기에 대한 메모 : 글꼴 크기와 같은 정확한 것은 없습니다. 타이포그래피에서 이것은 Em 사각형의 크기이며 글꼴의 x 높이와 직접 연결되지 않습니다. 또한, 비트 맵 렌더링 또는 리샘플링을 수행 할 경우 작은 비트 맵을 얻기 위해 Em-square (전체 비트 맵의 ​​경계)와 downsampling 요소의 픽셀 크기로만 작동합니다. 실제 x 높이 크기는 대략 참고 용으로 만 계산할 수 있습니다.

앤티 엘리 어싱되지 않은 비트 맵의 ​​경우 이러한 작은 비트 맵은 적어도 Arial 및 Times와 같은 기본 글꼴의 경우 글꼴 파일에 이미 포함되어 있어야합니다. IIRC TTF 내부에는 보통 7 ~ 16 피트의 작은 크기와 1 비트 마스크로 저장됩니다. 유일한 질문은 응용 프로그램에서 응용 프로그램을 추출하거나 가져 오는 방법입니다. 나는 진짜로 모른다, 나는 다만 유산 재료로 그 (것)들을 본다. 나는 현실적인 렌더링 문제를 더 많이 띤다.