2012-12-05 4 views
2

HTML5 캔버스 2D 컨텍스트가있는 사각형 격자를 만듭니다. & 캔버스의 크기를 그리드 사각형이 하나의 단위가되도록 변환하지만 30px, 말하자면 변환되지 않은 것입니다. Here's an example 10x10 크기의 30px 정사각형입니다.크기가 조정 된 HTML5 캔버스에서 글꼴 크기가 1보다 작 으면

한 가지를 제외하면 잘 작동합니다 : 텍스트.

정사각형 안에 들어 맞는 캔버스의 글꼴을 지정하려면 글꼴 크기를 1보다 작게 지정해야합니다.

예를 들어, ".5px sans-serif"는 정사각형 크기의 절반 (예 : 30px 변형되지 않은 사각형의 경우 "15px sans-serif")이어야합니다. Chrome에서 적어도 실패하고 캔버스가 더 큰 기본값으로 되돌아갑니다.

내가 찾은 유일한 해결책은 텍스트를 그릴 때 캔버스 크기 조정을 실행 취소하는 것입니다.

하위 픽셀 글꼴 사양을 통해이를 해결할 수있는 방법이 있습니까? (당연히 변환 후 폰트는 깔끔한 큰 폰트가 될 것입니다. 서브 픽셀 폰트 크기는 캔바스 변환에만 관련됩니다.)

답변

1

글꼴 절반 픽셀 변환되지 않은 것을 의미한다. 그것은 규모 아니다 값이지만 절대 값.

글꼴 크기를 크기 조정되지 않은 크기, 크기 조정 컨텍스트, 그리기 tex로 지정하십시오. t 및 그리드를 선택하고 필요에 따라 눈금을 제거하십시오.

이 데모는 행동이 표시됩니다 :
Scale demo

필수적인 부분 :

ctx.font = '15px sans-serif'; 
ctx.scale(1/30, 1/30); 
ctx.fillText('TEXT', 5, 5); 
ctx.strokeRect(0, 0, 30, 30); 

Example demo

이 예제는 왼쪽 상단에 작은 점을 생성합니다 모서리.

+0

척도가 아닌 ctx.setTransform (1, 0, 0, 1, 0, 0)을 저장하는 것이 좋습니다. – backspaces

+0

@backspaces save/restore는 성능면에서 다소 비쌉니다 (푸시/팝 스택 접근 방식을 사용하고 전체 컨텍스트의 설정을 저장/재검색 할 때 모두 필요합니다). setTransform은 스케일을 다시 설정하기위한 좋은 대안이지만, 스케일은 setTransform과 마찬가지로 변환 매트릭스 값을 설정하는 래퍼 일 뿐이지 만 scale()이 누적되면서 스케일을 완전히 재설정하려면 setTransform이 필요합니다. 희망이 대답을 도왔습니다! – K3N

+0

아아, 나는 그것을 놓쳤다. 저장/복구 쌍을 피하는 것은 좋은 생각이다. – backspaces

-1

솔직히 서브 픽셀 폰트 크기는 의미가 없습니다. 대신 텍스트를 모두 삭제하거나 "그리스어"텍스트 줄을 거의 직선으로 그어 두지 않을 수도 있습니다. 몇 가지 알려진 표준 크기로 measureText()를 사용하여 각 행의 적절한 상대적 길이를 얻은 다음 (읽을 수없는) 텍스트가 있음을 나타내는 직선을 작게 그립니다.

+0

글꼴은 canvas 변환으로 축척되므로 ctx.scale이 20 인 경우 ".5px serif"글꼴이 10px 글꼴로 렌더링됩니다.이 점이 제 질문의 핵심입니다. 작은 글꼴을 지정하고 싶습니다. 그 캔버스는 스케일링 이후에 의미있는 글꼴로 바뀝니다. – backspaces

+0

나는 왜 그런지 모르지만 나는 그 자신을 시도하는 제로 행운을 얻었습니다. 아마도 커닝은 크기가 조정되지 않은 크기로 적용되기 때문일 수 있습니다. 대신 나는 scale을 배치하는 것을 끝내었다 : 1.0의 텍스트는 확대/축소 된지도 위에 올려 놓았고, JS의 스케일 된 변환 값을 결정했다. – bjorke

+1

나는 같은 문제에 직면 해있다. 내 데이터는 정규화 (0-1)되고 또한 컨텍스트 변환에 적용되는 임의 변환이 있습니다. <.5가 사라지고 0.5가 크기 때문에 텍스트를 그릴 수없는 것 같습니다. Canvas 스펙이나 버그에 그냥 있습니까? 나는 해결책을보고 싶다. 또한, 내 변환 너무 쉽게 자바 스크립트에서 재현하기가 복잡합니다. –

1

힘든 일이라고 생각한 후에 변형을 사용하는 간단한 해결책이 있다는 것을 깨달았습니다.

컨텍스트가 현재 복잡한 방식으로 변형되어 있고 주어진 위치에 텍스트를 그려야한다고 생각하십시오. (tx,ty). 당신이 알 필요가있는 유일한 것은 현재의 눈금 (scaleX,scaleY)입니다 (이 값은 부분적인 폰트 크기를 계산하기 위해 알아야 할 필요가 있습니다). 그러면 변환 된 좌표계로 변환 한 다음 텍스트의 크기를 조정하고 그릴 수 있습니다 :

당신은 텍스트 크기와 관련된 모든 수학을해야하는 경우
ctx.save(); 
ctx.translate(tx, ty); 
ctx.scale(1/scaleX, 1/scaleY); 
ctx.fillText("Some String", 0, 0); 
ctx.restore(); 

은, '의 스케일 없음 "에서 수행 좌표를 할 수 있습니다. 0.5px에 글꼴 크기를 설정

관련 문제