2012-10-20 3 views
0

저는 dafont 저장소에서 TTF 형식으로 10 픽셀 높이의 비트 맵 서체를 모았습니다. 그러나 벡터 형식으로 보이는 것처럼 실제 비트 맵 데이터를 추출하는 데 문제가 있으며 렌더링 할 때 포인트 크기와 픽셀 크기 사이의 일치 성을 알 수 없습니다. 글자 형태와 일치하는 정확한 픽셀 별 비트 맵 데이터를 얻기 위해 소프트웨어 도구, 라이브러리 또는 접근 방식에 대한 제안이 필요합니다.POV 디스플레이의 TTF 비트 맵 서체에서 비트 맵 데이터를 추출하는 방법은 무엇입니까?

문제 말이 예 폰트 내 목적은 http://shrimping.it 프로젝트의 일부로서 비전 (POV) 디스플레이 아두 이노 기반 지속성을 제어하기 위해 이러한 비트 맵 폰트 중 하나 이상을 사용하는 것이다 http://www.dafont.com/commodore-64-pixelized.font

인 .

POV 장치는 장치를 좌우로 움직이면 LED를 깜박여 공기 중에 텍스트를 그리는 데 LED 선을 사용합니다. 잘 알려진 예는 Adafruit의 MiniPOV입니다. http://www.ladyada.net/make/minipov3/

LED를 플래시하는 마이크로 컨트롤러 코드를 작성하려면 서체에서 픽셀 별 정보를 가져와야합니다. 즉, 데이터 추출을위한 스키마가 필요합니다. 각 문자 및 각 글꼴에 대해 수동으로 수행하지 않아도되도록 TTF 형식 파일을 제공합니다.

지금까지 Processing (http://processing.org)을 실험 해 보았지만 정확히 일치하는 글꼴이 그려 지도록 TTF를 렌더링하기 위해 포인트 크기를 선택하는 방법을 볼 수 없습니다 기본 픽셀 그리드로 일단이 정보가 있으면 정보를 얻을 수는 있지만 거기에 갈 수는 없습니다. Processing에 의해보고 된 textAscent 및 textDescent 값은 적어도 내가 시도한 글꼴에 대해서는 쓸모없는 것으로 보입니다.

내가 테스트중인 글꼴은 Advocut, Andina, 보조 DotBitC, BM 튜브, Commodore 64 Pixelised, Homespun BRK, Nayupixel, SG05 및 Visitor입니다. 문제를 더 잘 이해하기 위해 원본 데이터를 볼 필요가있는 경우 dafont.com에서 검색하여 이러한 데이터를 검색 할 수 있습니다.

답변

0

세 부분으로 된이 문제를 발견했습니다.

1 단계

먼저 내가주는 ... 대화 형 파이썬 쉘에서 다음 '파이썬'를 입력하여 출력

import string 
print(''.join([chr(x) for x in range(33,127)])) 

를 모든 인쇄 가능한 그래픽 ASCII 문자를, 파이썬을 사용 다음 문자 시퀀스 - SPACE (32) 및 DEL (127)를 생략 ...

!"#$%&'()*+,-./:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 

2 단계

,617,

그런 다음 Inkscape를 시작하고, View> Grid로 보이는 픽셀 그리드를 활성화하고 주어진 글꼴의 한 줄에 모든 문자를 포함하는 텍스트 요소를 만들었습니다. 어떤 문자가 픽셀이 아닌 글리프로 떨어 졌는지 시각적으로 확인했습니다. (문자가 완전히 지정되지 않은 곳에서는 정규의 글꼴을 삽입한다고 생각합니다. 정수가 아닌 숫자의 픽셀이 삽입되어 가로 커닝을 엉망으로 만들고 나머지 문자를 잘못 배치하여 대체해야합니다.) 내가 보았던 픽셀 화되지 않은 문자를 물음표로 대체했습니다.이 문자는 안정적으로 존재하며 정수 서체 수를 가진 문자입니다.

모든 문자가 깨끗한 픽셀 문자이고, 텍스트 요소를 선택한 상태에서 (좌표 막대를 맨 위에 표시) 확대 된보기로 텍스트를 0,0에 배치 할 수있었습니다. 픽셀 요소를 백킹 그리드와 일렬로 만든 픽셀 높이를 수동으로 선택하십시오 (8,9,10,11 픽셀을 높이로 전환했을 때 잠금 기호가 활성화되어 수평 및 수직 치수를 함께 조정했는지 확인하십시오.) 경우에 따라 이른바 10 픽셀 글꼴은 사실상 8 픽셀이나 11 픽셀 높이였습니다. 제대로 정렬했을 때 몇 가지 문제가있었습니다.

때로는 정확한 높이 매핑이 단편 이었기 때문에 수평 수를 확인하여 조정했습니다. 픽셀이 맞았습니다 (예 : 실제 높이 가로 세로 618 픽셀, 높이 7.005 픽셀과 같이 분수입니다. 문자를 따라 스캔하면 픽셀이 약간 짧거나 약간 긴지 알 수 있으며 픽셀이 그리드에 맞을 때까지 너비를 정수로 설정할 수 있습니다. 높이의 부동 소수점 차이는 Inkscape에서 거의 볼 수 없으며 (반올림 된 부분은 반올림 됨) 내보내기에 눈에 띄는 효과는 없지만 수평 개수가 잘못되면 픽셀 매핑이 촬영되고 오프셋으로 인해 수평 흐리게 처리 된 픽셀이 생성됩니다. 당신은 양자화하려고합니다.

마지막으로 텍스트 요소가 선택된 상태에서 파일> 비트 맵 내보내기를 선택하고 '선택'탭을 선택했습니다. 이전 단계에서 8, 10, 11 또는 그 밖의 픽셀 수를 가진 PNG를 내 보내면 완벽한 픽셀 매핑을 사용하여 픽셀 그래픽을 생성합니다.이 픽셀은 간단한 루틴을 사용하여 비트 맵을 추출 할 수있는 파일입니다.

3 단계

마지막 절차가 PNG를 가져오고 POV 비트 맵에 대한 정확한 문자 별 정보를 추출하기 위해 작성해야합니다.

필자는 문자의 수평 범위를 안정적으로 감지하는 루틴을 만들었으며이를 내 POV의 개별 시퀀스로 조각 수 있습니다. 이 글꼴은 고정 폭 글꼴이 아니므로 각 문자의 너비는 예측할 수 없습니다. 느낌표는 종종 단지 2 픽셀 너비입니다. 특수한 경우에는 두 개의 틈을 포함하는 큰 따옴표 문자를 코딩해야합니다.

내 추출 루틴의 소스에서 지금 ...

http://shrimping.it/shrimp/project/pov/font/extract_font.py

... 그리고 디렉토리에 CDing 및

을 실행하여 디렉토리에 PNG 파일의 집합에 실행할 수 있습니다
python extract_font.py 

이렇게하면 각 글꼴에 대해 개별 디렉터리로 추출 된 각 문자에 대해 개별 비트 맵을 생성합니다.

+0

트위터를 통해 제안하신 내용은 https://twitter.com/mgdm/status/259669824769245184 및 https://twitter.com/gordonjcp/status/259664637342142464에게 감사드립니다. 아무 것도 아직 Stackoverflow 통해 : ( – user336590

+0

문자 사이의 간격이 다양하기 때문에이 해결 방법을 사용하여 현재 형식으로 Andina 서체를 사용할 수없는 것처럼 보입니다 (예 :? 및 N 문자의 픽셀 간격이 부분적입니다) – user336590

+0

Nayupixel 서체는 간격과 비슷한 문제가 있지만 아주 나쁜 것은 아니며 수직에서 독립적으로 수평을 늘린 다음 Gimp의 Image> Mode> Indexed> 1bit 색상을 사용하여 비트 맵으로 병합하면 복구가 가능합니다 – user336590