2016-02-13 2 views
2

У меня проблема с простым средством просмотра изображений, которое я делаю. Вы видите, что мне хотелось бы, чтобы изображение было выбрано для масштабирования или масштабирования в зависимости от ширины и высоты изображения. Таким образом, снимок 1920 x 1080 будет уменьшен до управляемого размера, но изображение 40 x 40 будет выглядеть достаточно большим, чтобы четко видеть.Алгоритм автомасштабирования Python?

Этот масштабный коэффициент я бы предпочел бы как в одной переменной, так и без использования операторов IF, потому что делаю IF pic_h> 100: и т. Д. ... вы получаете точку.

Вот где я нахожусь:

for x in range(int(pic_w)): 
    xline = target.readline() 
    for y in range(int(pic_h)): 
     pixel_data = xline[y:y+1] 

     sf = <THIS IS THE BIT I NEED> 
     y1b = (y*2)+0 
     x1b = (x*2)+0 
     y2b = (y*2)+2 
     x2b = (x*2)+2 

     y1w = (y*2)+0 
     x1w = (x*2)+0 
     y2w = (y*2)+2 
     x2w = (x*2)+2 

     if pixel_data == "1": 
      pixel = canvas.create_rectangle(y1b, x1b, y2b, x2b, fill="black") 
     elif pixel_data == "0": 
      pixel = canvas.create_rectangle(y1b, x1b, y2b, x2b, fill="white") 
     else: 
      blah blah blah ............ 

varibles pic_h и pic_w являются высота изображения и ширина.

+0

Есть много решений этого, но вы можете попробовать 'SF = макс (100/pic_w, 100/pic_h)' для начинающих – Selcuk

+0

Что GUI инструментарий вы используете? Если вы делаете то, что, я думаю, вы делаете, и это в Tk, canvas.create_rectangle собирается создать живой объект для каждого пикселя, который будет очень медленным и голодным. Попробуйте использовать библиотеки, такие как PIL или ImageMagick для ваших операций с изображениями, для создания одного объекта Bitmap, который может быть эффективно задействован. –

+0

Да, это правда, что это в tkinter, я понимаю, что это невероятно медленно, но это часть проблемы, основанной на школе, поэтому хорошая идея, но у этой проблемы есть критерии: D –

ответ

1
width, height = maximum size in pixels 
x, y = number of pixels 

maxSize = min(width, height) 
width = = (maxSize//x)*x 
height = (maxSize//y)*y 

xScale = (width/x) 
yScale = (height/y) 

for row in xrange(y): 
    for column in xrange(x): 
    canvas.create_rectangle((column * xScale, row * yScale, (column * xScale)+xScale, (row * yScale)+yScale), fill=data) 
+0

Просьба представить некоторые комментарии и обоснования для вашего ответа, а не просто публиковать блок кода. – Suever

+0

Мне нравится, что это работает, но я бы идеально хотел, чтобы все это содержалось в этой переменной 'sf' –

+0

Я мог бы либо заняться большим пространством, либо просто дать короткий краткий ответ и быть более эффективным. Во всяком случае, автор OP имеет доступ к git-репозиторию со всем этим кодом, поэтому я предоставил максимальный возможный контекст. – SolarFactories

Смежные вопросы