Недавно делал для себя, чтобы обрезанную в нужных пропорциях цифровую фотографию распечатать в нужном размере на фотопринтере. На скорую руку, багов особо не ловил, но "у меня всё работает". На Linux работает, на Windows не проверял, но тоже должно. Нужны Python 3.x, OpenCV и NumPy (всё ставится моментально из репозиториев или через pip, Python на Linux обычно и так есть уже).
Код
#!/usr/bin/env python3
import cv2
import numpy as np
import sys
def tile(img_in, img_size_mm, paper_size, paper_size_unit = "in", bgvalue = 255):
img_size = np.array(img_size_mm, dtype=np.float64) # w, h
paper_size = np.array(paper_size, dtype=np.float64) # w, h
if paper_size_unit == "in": paper_size *= 25.4
elif paper_size_unit != "mm":
raise Exception("Unknown paper unit size, use in or mm")
n_cols_rows = (paper_size // img_size).astype(np.uint64)
gaps = (paper_size % img_size) / (n_cols_rows + 1) # w_gap, h_gap
h, w, _ = img_in.shape # h, w
mm2px = h / img_size[1]
paper_size_px = (paper_size * mm2px).astype(np.uint64)
gaps_px = (gaps * mm2px).astype(int)
img_out = np.full(shape=(paper_size_px[1], paper_size_px[0], 3), fill_value = bgvalue, dtype = np.uint8)
cur_top = gaps_px[1]
for row in range(n_cols_rows[1]):
cur_left = gaps_px[0]
for col in range(n_cols_rows[0]):
img_out[cur_top : int(cur_top + h), cur_left : int(cur_left + w)] = img_in
cur_left += int(w + gaps_px[0])
cur_top += int(h + gaps_px[1])
return img_out
if __name__ == '__main__':
try:
input_name = sys.argv[1]
output_name = sys.argv[2]
input_size = sys.argv[3:5]
paper_size = sys.argv[5:7]
paper_size_unit = sys.argv[7] if len(sys.argv) > 7 else "in"
paper_bgvalue = sys.argv[8] if len(sys.argv) > 8 else 255
except Exception as e:
print(f"{sys.argv[0]} input.jpg output.jpg <input width mm> <input height mm> <paper width> <paper height> <paper unit (in or mm)> <fill value (0~255)>")
sys.exit(0)
img = cv2.imread(input_name)
img_t = tile(img, input_size, paper_size, paper_size_unit, paper_bgvalue)
cv2.imwrite(output_name, img_t)
Чтобы разложить нижеприведённую фотографию на лист размером 4 на 6 дюймов (варварство, но что я с ним могу сделать, разве что каждый раз умножать на 25.4... зато размеры исходника задаются только в миллиметрах!), и каждая напечатанная фотография была 30 на 40 мм, на чёрном фоне:
Примитивный редактор "обрезать/подогнать под нужный размер", вроде, делают, а удаление фона, да чтоб корректно обработало всю волосню по краям - на хера? Так трудно встать на фоне белой стены и щёлкнуть смартфоном физиономию?
Ну вот, например, для визы в Японию в требованиях к фотографии прямо указано: "Do NOT use filters". Мне казалось, для визы в США я тоже аналогичное требование видел, но чё-то на их сайте не найду - может, и впрямь, показалось. Разве вот в разделе FAQ есть про красные глаза:
Can I remove the red-eye from my photo?
It is acceptable to use the red-eye reduction option on your digital camera when you are taking the photo. However, you cannot use any photo editing tool to digitally remove the red-eye from your photo. In general, you are not allowed to digitally enhance or alter the photo to change your appearance in any way.
Во всяком случае, обработка типа "resize, rotate and crop" в явном виде позволяется. Что до удаления фона - я не осилил понять, вроде, это "digitally enhance", но не "change your appearance". Ну и отписка "а мы рассмотрим, и, может, отвергнем".
Иероглифов с чтением "ки", совершенно разных и по смыслу, и по начертанию, если взять только наиболее употребимые, наберётся, думаю, не меньше полусотни (а если вообще все, то, возможно, и на тысячи счёт пойдёт), например: 木 - "дерево", 機 - "механизм", 期 - "отрезок времени", 記 - "запись", 危 - "страх, опасность", и т. д., и т. п., можно столько интерпенетраций нагородить.
Слово "муда" (無駄) не является специфическим термином, оно широко употребимо в быту и означает всего лишь "бесполезность, бессмысленная трата чего-либо". Например, в японском переводе "Чебурашки" старуха Шапокляк поёт: "Хито о таскете мо дзикан но муда" (дословно "помощь людям - пустая трата времени").
Да нет там никакой проблемы. Будучи высказана в античном полисе в адрес персонажа, являющегося, как минимум, гоплитом, эта фраза, возможно, имела бы смысл. Будучи высказана в наше время в комментариях в адрес других комментаторов, она является не более чем пустой, звенящей пошлостью.
Не могу поддерживать накал, максимум дичи, что я видел - софтина с довольно развесистым и навороченным гуём под винду, который был весь серьёзно переделан при помощи хуков, потому что исходников не было. Работало и продавалось, но, видимо, так всех задолбало, что мне как раз поручили по-нормальному переписать с нуля (а как ещё, исходников-то не было).
У меня на работе несколько лет назад был проект: софтина на Java с вкраплениями вроде каких-то нативных библиотек на C++, софтина на C++ со встроенным Python 2.x в качестве движка для плагинов, софтина на Unity (C#) со встроенным IronPython в качестве движка для скриптов, софтина на Python 3.x, и весь этот весёлый зоопарк дёргает друг дружку по сети, выдавая команды, запуская скрипты и делая всякое. И мне довелось в той или иной мере приложить руку ко всему из этого, хотя Джаву с Сишарпом я не знал никогда, а второй Питон успел забыть. Работало, хотя разворачивать всё это было довольно мучительно.
Я так понимаю, прошаренный программист должен писать, как Лев Толстой: длииииинный однострочник, и чтобы где-то посерёдке ещё процентов двадцать было на другом языке программирования.
Да и ТЗ, сформулированное как "Наташа Ростова - любимый персонаж Толстого", с которым непонятно, чего делать, тоже, наверное, готовило к определённым будущим реалиям. Всё, я понял формулу успеха. ЧатЖПТ, напиши мне статью для русскоязычного IT-ресурса, озаглавленную "Пиши код, как Лев Толстой".
Да ну нет же, очередная филиппика, скрывающая за цветастостью слога отсутствие содержимого. Какой же народ не считает себя наиболее достойным, превыше прочих? Да примерно любой считает, начиная с первобытно-общинного строя, где самоназвание племени, как правило, означает "люди", подразумевая, что все прочие племена как бы и не очень люди. Чукчи, папуасы, буркина-фасийцы - уже фашисты? Какой же народ хочет беспорядков и засилие инородцев? Минин и Пожарский какие-нибудь, установившие порядок и турнувшие инородцев-поляков - фашисты?
Всю эту вот подобную ахинею почитаешь, и ясно становится только одно: 1. либо никакого "фашизма" не существует вовсе; 2. либо "фашизмом" следует считать буквально любое государственное устройство - что, в сущности, эквивалентно п. 1 (зачем что-то называть "фашизмом", когда всё "фашизм"); 3. либо же дело в степенях этого всего - насколько "достойным" должен осознаваться народ, насколько "железным" должен стать порядок, и т. п., чтобы вчера ещё не фашизм, а сегодня последний показатель дошёл до нужной рисочки - всё, с часу ноль-нуль фашизм... но определений, хотя бы пытающихся оперировать степенями масштабов трагедии я не встречал вовсе. Вот эти три пункта испанской инквизиции становятся понятны после прочтения подобных "памяток", а по-существу, как и прежде, не понятно решительно ничего.
А какая, собственно, должна быть разница конечному пользователю-интеллигенту, стремящемуся подобрать в команду таких же коллег, были они воспитаны вузом в интеллигентов или отобраны вузом как интеллигенты?
Недавно делал для себя, чтобы обрезанную в нужных пропорциях цифровую фотографию распечатать в нужном размере на фотопринтере. На скорую руку, багов особо не ловил, но "у меня всё работает". На Linux работает, на Windows не проверял, но тоже должно. Нужны Python 3.x, OpenCV и NumPy (всё ставится моментально из репозиториев или через pip, Python на Linux обычно и так есть уже).
Код
Чтобы разложить нижеприведённую фотографию на лист размером 4 на 6 дюймов (варварство, но что я с ним могу сделать, разве что каждый раз умножать на 25.4... зато размеры исходника задаются только в миллиметрах!), и каждая напечатанная фотография была 30 на 40 мм, на чёрном фоне:
./tile.py input.jpg output.jpg 30 40 4 6 in 0Результат
Примитивный редактор "обрезать/подогнать под нужный размер", вроде, делают, а удаление фона, да чтоб корректно обработало всю волосню по краям - на хера? Так трудно встать на фоне белой стены и щёлкнуть смартфоном физиономию?
Ну вот, например, для визы в Японию в требованиях к фотографии прямо указано: "Do NOT use filters". Мне казалось, для визы в США я тоже аналогичное требование видел, но чё-то на их сайте не найду - может, и впрямь, показалось. Разве вот в разделе FAQ есть про красные глаза:
Во всяком случае, обработка типа "resize, rotate and crop" в явном виде позволяется. Что до удаления фона - я не осилил понять, вроде, это "digitally enhance", но не "change your appearance". Ну и отписка "а мы рассмотрим, и, может, отвергнем".
Ну да, я ж и написал: "столько интерпенетраций".
Просто "*опа" является как бы ещё одним слоем нейронной сети.
Интуиция в голове - это, наверное, как вайб-кодинг в компьютере.
Иероглифов с чтением "ки", совершенно разных и по смыслу, и по начертанию, если взять только наиболее употребимые, наберётся, думаю, не меньше полусотни (а если вообще все, то, возможно, и на тысячи счёт пойдёт), например: 木 - "дерево", 機 - "механизм", 期 - "отрезок времени", 記 - "запись", 危 - "страх, опасность", и т. д., и т. п., можно столько интерпенетраций нагородить.
Слово "муда" (無駄) не является специфическим термином, оно широко употребимо в быту и означает всего лишь "бесполезность, бессмысленная трата чего-либо". Например, в японском переводе "Чебурашки" старуха Шапокляк поёт: "Хито о таскете мо дзикан но муда" (дословно "помощь людям - пустая трата времени").
Для объективной реальности, данной в ощущениях.
Да нет там никакой проблемы. Будучи высказана в античном полисе в адрес персонажа, являющегося, как минимум, гоплитом, эта фраза, возможно, имела бы смысл. Будучи высказана в наше время в комментариях в адрес других комментаторов, она является не более чем пустой, звенящей пошлостью.
В ваших комментариях есть лексическая связность, но, по-моему, отсутствует связность смысловая.
Не могу поддерживать накал, максимум дичи, что я видел - софтина с довольно развесистым и навороченным гуём под винду, который был весь серьёзно переделан при помощи хуков, потому что исходников не было. Работало и продавалось, но, видимо, так всех задолбало, что мне как раз поручили по-нормальному переписать с нуля (а как ещё, исходников-то не было).
У меня на работе несколько лет назад был проект: софтина на Java с вкраплениями вроде каких-то нативных библиотек на C++, софтина на C++ со встроенным Python 2.x в качестве движка для плагинов, софтина на Unity (C#) со встроенным IronPython в качестве движка для скриптов, софтина на Python 3.x, и весь этот весёлый зоопарк дёргает друг дружку по сети, выдавая команды, запуская скрипты и делая всякое. И мне довелось в той или иной мере приложить руку ко всему из этого, хотя Джаву с Сишарпом я не знал никогда, а второй Питон успел забыть. Работало, хотя разворачивать всё это было довольно мучительно.
Получается, просто у вас недоработана модель задачи, имея в составе своём зияющие пробелы. Как тут могут помочь советы по написанию программного кода?
Я уж подумал, KDE 2 наконец-то пропатчили...
Я так понимаю, прошаренный программист должен писать, как Лев Толстой: длииииинный однострочник, и чтобы где-то посерёдке ещё процентов двадцать было на другом языке программирования.
Да и ТЗ, сформулированное как "Наташа Ростова - любимый персонаж Толстого", с которым непонятно, чего делать, тоже, наверное, готовило к определённым будущим реалиям. Всё, я понял формулу успеха. ЧатЖПТ, напиши мне статью для русскоязычного IT-ресурса, озаглавленную "Пиши код, как Лев Толстой".
Да ну нет же, очередная филиппика, скрывающая за цветастостью слога отсутствие содержимого. Какой же народ не считает себя наиболее достойным, превыше прочих? Да примерно любой считает, начиная с первобытно-общинного строя, где самоназвание племени, как правило, означает "люди", подразумевая, что все прочие племена как бы и не очень люди. Чукчи, папуасы, буркина-фасийцы - уже фашисты? Какой же народ хочет беспорядков и засилие инородцев? Минин и Пожарский какие-нибудь, установившие порядок и турнувшие инородцев-поляков - фашисты?
Всю эту вот подобную ахинею почитаешь, и ясно становится только одно: 1. либо никакого "фашизма" не существует вовсе; 2. либо "фашизмом" следует считать буквально любое государственное устройство - что, в сущности, эквивалентно п. 1 (зачем что-то называть "фашизмом", когда всё "фашизм"); 3. либо же дело в степенях этого всего - насколько "достойным" должен осознаваться народ, насколько "железным" должен стать порядок, и т. п., чтобы вчера ещё не фашизм, а сегодня последний показатель дошёл до нужной рисочки - всё, с часу ноль-нуль фашизм... но определений, хотя бы пытающихся оперировать степенями масштабов трагедии я не встречал вовсе. Вот эти три пункта испанской инквизиции становятся понятны после прочтения подобных "памяток", а по-существу, как и прежде, не понятно решительно ничего.
Я бы поостерёгся, а ну как Владимир Владимировичу за двойника автоматический штраф начислится?
А ну как вам не пондравится, тогда что?
А какая, собственно, должна быть разница конечному пользователю-интеллигенту, стремящемуся подобрать в команду таких же коллег, были они воспитаны вузом в интеллигентов или отобраны вузом как интеллигенты?