17

다양하지만 알려진 크기의 이미지에 배치 할 텍스트의 크기를 동적으로 조정하려고합니다. 텍스트가 워터 마크로 적용됩니다. 이미지 크기와 관련하여 텍스트 크기를 조절할 수있는 방법이 있습니까? 나는 텍스트가 전체 표면적을 차지할 필요는 없으며, 쉽게 눈에 띄기 쉽기 때문에 쉽게 식별 할 수 있고 제거하기 어렵다. 파이썬 이미징 라이브러리 버전 1.1.7을 사용하고 있습니다. Linux에서.PIL 이미지의 크기를 기준으로 텍스트 크기를 조정하는 방법

텍스트 크기와 이미지 크기의 비율을 1/10 크기 또는 그 이상으로 설정할 수 있습니다.

크기를 변경하려면 글꼴 크기 특성을 살펴 보았지만 크기를 조정하는 알고리즘을 만드는 데 아무런 운이 없었습니다. 더 좋은 방법이 있는지 궁금 하네.

어떻게하면이 아이디어를 얻을 수 있습니까?

감사 일반적으로

답변

37

적합성을 찾을 때까지 글꼴 크기를 증가시킬 수 있습니다. font.getsize()은 렌더링 된 텍스트의 크기를 알려주는 함수입니다. 이 당신을 위해 충분히 효율적으로하지 않으면

import ImageFont, ImageDraw, Image 

image = Image.open('hsvwheel.png') 
draw = ImageDraw.Draw(image) 
txt = "Hello World" 
fontsize = 1 # starting font size 

# portion of image width you want text width to be 
img_fraction = 0.50 

font = ImageFont.truetype("arial.ttf", fontsize) 
while font.getsize(txt)[0] < img_fraction*image.size[0]: 
    # iterate until the text size is just larger than the criteria 
    fontsize += 1 
    font = ImageFont.truetype("arial.ttf", fontsize) 

# optionally de-increment to be sure it is less than criteria 
fontsize -= 1 
font = ImageFont.truetype("arial.ttf", fontsize) 

print 'final font size',fontsize 
draw.text((10, 25), txt, font=font) # put the text on the image 
image.save('hsvwheel_txt.png') # save it 

, 당신은 루트 찾는 방식을 구현할 수 있습니다,하지만 난 font.getsize() 기능은 이미지 편집 과정의 나머지 부분에 비해 작은 감자입니다 같은데요.

+4

안녕 폴, 그 트릭을했다. 도와 주셔서 감사합니다 – Shpongle

5

당신은 글꼴의 크기에 선형 변경 될 수 없습니다 크기의 글꼴을 변경합니다.

Non-linear Scaling

지금이 종종 소프트웨어, 글꼴, 등 ...이 예제는 Typophile에서 찍은에 따라 달라 라텍스 + 컴퓨터 현대 글꼴을 사용합니다. 볼 수 있듯이 선형 스케일링이 아닙니다. 그래서 비선형 폰트 스케일링에 문제가 있다면 어떻게 해결해야할지 모르겠다.하지만 한 가지 제안이있을 것이다.

  1. 원하는 크기에 가깝게 글꼴을 렌더링, 그 스케일 업/다운 일반 이미지 크기 조정 알고리즘을 통해 ...
  2. 그냥 정확히 선형 스케일링 수 없다는 점에 동의하고 만들려고 글꼴에 가장 가까운 포인트 크기를 선택하는 일종의 테이블/알고리즘이 이미지 크기와 일치합니다.
+0

답장을 보내 주셔서 감사합니다. Paul이 제안한 방법으로 해결했습니다. 어쨌든 고마워. – Shpongle

+0

이미지를 보는 첫 번째 생각은 "텍스트로 선 높이를 조정하지 않으면 그 선이 선형으로 보이지 않을 것입니다."라고 생각했습니다. 그러나 선의 길이를 비교하면 6pt 폰트의 렌더링 된 길이가 12pt의 절반 이상이고 5pt가 10pt의 길이의 절반 이상이라는 것을 알 수 있습니다. – Ian