lumixograf (lumixograf) wrote,
lumixograf
lumixograf

Программка для нарезки больших фото. Наброски =). Python

Друзья, а у кого из вас есть интерпретатор Pyton-а на компе?
Если вы используете Linux, он у вас автоматически есть.

Пишу я небольшую утилитку для нарезки панорамных фотографий на кусочки для печати, интересно стало - будет ли кому полезным?

barma_glott недавно выкладывал список сайтов полезных, так вот, там был один сервис - по созданию постеров.
Мне он не понравился - либо там денюжек надо отдать, либо он изначально задуман так странно - без эффектов никак. Либо тебе растеризация, либо ещё какие-то ненужные мне эффекты.

Резать вручную в Gimp-е мне вообще не хочется, а печатать - хочется. И программки на питоне давно не писал, решил размять мозг.

Результат - исходники - под катом.

Пока не всё продумано, конечно, например о перехлёсте я пока не парился.
Программка принимает на входе имя файла картинки, и dpi.

Например, python poster.py /home/max/img/pana1.png 300

Потом она берёт размеры А4 и прикидывает, как лучше листы разместить - вертикально или горизонтально. Надо допилить.
Потом прикидывается, сколько надо листов.
Потом пытается растянуть картинку так, чтобы по одному измерению она занимала все предложенные листы.
И сохраняет в папку = имя файла + _poster - нарезанными jpg-шками.



#! -*- coding:utf-8 -*-

import Image, sys
from math import ceil
from os import mkdir
import os

fn = sys.argv[1]
dpi = int(sys.argv[2])
dpm = dpi / 25.12

#wcount = sys.argv[3] 

img = Image.open(fn)

poster_dir = fn + "_poster"
if not os.path.exists(poster_dir):
    try:
       r = mkdir(poster_dir)
       print "Результат будет в ", poster_dir
    except:
       print "Не удалось создать папку под результат"

help = """
Запрашивает имя файла, dpi, количество листов по ширине
"""

a4_w = 297.0
a4_h = 210.0

print fn
print img.size

w,h = img.size



ar = (w+0.0)/h

print 'aspect ratio', ar

img_width_mm =  w * 25.12 / dpi
img_height_mm = h * 25.12 / dpi

print "inches/mm width" , w / dpi, img_width_mm
print "inches/mm height" , h / dpi, img_height_mm 

wcount = img_width_mm / a4_w
hcount = img_height_mm / a4_h

iwcount = img_height_mm / a4_w
ihcount = img_width_mm / a4_h

print "h, w count", hcount, wcount
print "ih, iw count", ihcount, iwcount

err1 =  hcount - round(hcount)
err2 = ihcount - round(ihcount)

vertical_a4 = True

if err1 <= err2:
    print "Предлагается %d листа горизонтальных А4 по вертикали, %d листов А4 по горизонтали " %( hcount, wcount )
    vertical_a4 = False
    tail_width = 297.0
    tail_height = 210.0


else:
    print "Предлагается %d листа вертикальных А4 по вертикали, %d листов А4 по горизонтали " %( ihcount, iwcount )
    vertical_a4 = True
    tail_width = 210.0
    tail_height = 297.0

h_tail_count = img_width_mm / tail_height
w_tail_count = img_height_mm / tail_width

k_err_h = int(ceil(h_tail_count)) * tail_height / img_height_mm
k_err_w = int(ceil(w_tail_count)) * tail_width / img_width_mm



print "Возможен результат больше в %f раз по вертикали или %f по горизонтали" %( k_err_h, k_err_w)

if k_err_h > k_err_w: 
    k_err = k_err_w
else:
    k_err = k_err_h

dpm = dpm/k_err

print "dpm ", dpm

print "hc", int(h_tail_count ), ceil(h_tail_count)
print "wc", int(w_tail_count ), w_tail_count


for i in xrange(int(ceil(h_tail_count))):
    for j in xrange(int(ceil(w_tail_count))):
        print "tail", i,j 
        box = (int(j * tail_width * dpm), int(i* tail_height * dpm), int((j + 1) * tail_width* dpm), int((i + 1) * tail_height * dpm) )
        print box

        tmpImg = img.crop(box).save(os.path.join(poster_dir, "tail_%d_%d.jpg" % (i, j)))


Tags: python, графика, нарезка изображения, постер, программирование
Subscribe

  • Переобул ниву

    Пять лет на ниве-шниве, и вот наконец досталась ей более-менее грязевая резина) Cordiant Off-Road, 215/65 R16 - родной размерчик. Готовился с…

  • Вечерняя прогулка

    Допустили вчера оплошность - показали еду собаке перед прогулкой! Творог дали перед выходом, а остальное я спрятал в вольере, вольер закрыл. Чтоб…

  • Год назад мы переехали в дом!

    В квартире хорошо, а самоизоляция в собственном доме - лучше! 12 апреля прошлого года мы сделали вжух с квартиры в дачные условия)…

promo lumixograf september 3, 2015 09:36 4
Buy for 20 tokens
Я понял - когда откроется сезон, обязательно скатаемся на вершину на подъёмнике под звёздами! С подъёмника ничего не снять, но вот с горы - будет круто! Здесь 4 секунды выдержки, iso1600, 25/2.8, склейка в Gimp 2.9 двух сконвертированных в Tiff рав-файлов)
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments