Так мне было
скучно вчера, сидеть и учить эти унылые
билеты
ПДД, что я придумал себе развлекуху
— написать скрипт для исправления
косяков заливки фоток с вебкамеры.
Развлекся
отлично, сто строк кода, задача решена,
скуки как не бывало.
Вот работающий
пример кода на Python, где в дереве каталогов
(папок) ищутся файлы определенного типа
(JPG), список найденного сортируется по
времени модификации файлА, найденное
файлО копируется куда заказано и, в
качестве бонуса, на картинку ставится
временной штамп, чтобы видно было, когда
сделана фоточка.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- mode: python; coding: utf-8 -*- | |
# Copyright (c) Valentin Fedulov <vasnake@gmail.com> | |
''' This script intended to fix some webcam software problems. | |
It's job can be described in three points: | |
First step: find latest JPG file in SEARCH_IN folder and subfolders. | |
Next step: copy that file to WRITE_TO destination. | |
Last step: put a timestamp on lower right corner of the WRITE_TO image. | |
Tested on Linux CentOS 6. | |
You may need to install PIL: | |
yum install python-imaging | |
also you'll need FreeSans.ttf (http://ftp.gnu.org/gnu/freefont/), refer to FONT constant. | |
Usage | |
Edit FONT, SEARCH_IN and WRITE_TO constants and call script like: | |
sudo -u ftpsecure python -u /opt/webcamfixer.py | |
or set a crontab job: | |
nano /etc/crontab | |
SHELL=/bin/bash | |
PATH=/sbin:/bin:/usr/sbin:/usr/bin | |
MAILTO=root | |
HOME=/ | |
*/3 * * * * ftpsecure python -u /opt/webcamfixer.py | |
Ftpsecure came from my vsftpd setup, just forget about it. | |
''' | |
from __future__ import print_function | |
import time | |
import os | |
import shutil | |
from PIL import Image, ImageDraw, ImageFont | |
FONT = "/opt/FreeSans.ttf" | |
SEARCH_IN = u'/home/ftpsecure' | |
WRITE_TO = u'/home/ftpsecure/cam_1.jpg' | |
print(u"Clubwindsurf webcam picture fixer. {timestamp}".format(timestamp=time.strftime('%Y-%m-%d %H:%M:%S'))) | |
def main(): | |
fname = findLatestJpg(SEARCH_IN) | |
if fname == WRITE_TO: | |
print(u"File is fresh as it is, quit.") | |
else: | |
statinfo = os.stat(fname) | |
if statinfo.st_size > 0: | |
if copyFile(fname, WRITE_TO): | |
timeInfo = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(statinfo.st_mtime)) | |
addTimeStamp(WRITE_TO, timeInfo) | |
def findLatestJpg(dirName): | |
fileName = u'' | |
listFiles = findFiles(dirName, u'jpg') | |
def getMtime(fn): | |
res = 0 | |
try: | |
statinfo = os.stat(fn) | |
if statinfo.st_size > 0: | |
res = statinfo.st_mtime | |
except: | |
print(u"Problem with {fn}".format(fn=fn)) | |
return res | |
sortedLF = sorted(listFiles, key=getMtime, reverse=True) | |
if sortedLF: | |
fileName = sortedLF[0] | |
return fileName | |
def copyFile(fromName, toName): | |
if fromName and toName: | |
if not fromName.lower() == toName.lower(): | |
print(u"Copy from {fromName} to {toName}".format(fromName=fromName, toName=toName)) | |
shutil.copy(fromName, toName) | |
return True | |
return False | |
def findFiles(scandir, ext): | |
'''Returns list of file names with extension 'ext' | |
recursively finded inside 'scandir' | |
scandir, ext is a unicode strings | |
''' | |
ftype = u'.' + ext.lower() | |
lstFiles = [] | |
for root, dirs, files in os.walk(scandir): | |
for f in files: | |
fn = os.path.join(root, f) | |
if fn.lower().endswith(ftype): | |
lstFiles.append(unicode(fn)) | |
return lstFiles | |
def addTimeStamp(fileName, timeInfo): | |
'''80% of this function code came from | |
http://jepoirrier.org/2008/11/24/short-script-to-add-a-timestamp-on-pictures/ | |
https://github.com/jepoirrier/miscScripts/blob/master/timestampFiles.py | |
''' | |
fontSize = 15 | |
textPadding = 2 | |
boxWidth = 150 | |
boxHeight = 25 | |
im = Image.open(fileName) | |
topLeftWidth = int(im.size[0] - boxWidth) | |
topLeftHeight = int(im.size[1] - boxHeight) | |
imfont = ImageFont.truetype(FONT, fontSize) | |
draw = ImageDraw.Draw(im) | |
draw.rectangle([topLeftWidth, topLeftHeight, im.size[0], im.size[1]], | |
fill="black") | |
draw.text([topLeftWidth + textPadding, topLeftHeight + textPadding], | |
timeInfo, fill="lime", font=imfont) | |
del draw | |
im.save(fileName, 'JPEG', quality=90, optimize=True) | |
if __name__ == "__main__": | |
main() |
original post http://vasnake.blogspot.com/2014/07/webcamfixer.html
Комментариев нет:
Отправить комментарий