Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2014-07-29

webcamfixer

Так мне было скучно вчера, сидеть и учить эти унылые билеты ПДД, что я придумал себе развлекуху — написать скрипт для исправления косяков заливки фоток с вебкамеры.
Развлекся отлично, сто строк кода, задача решена, скуки как не бывало.

Вот работающий пример кода на Python, где в дереве каталогов (папок) ищутся файлы определенного типа (JPG), список найденного сортируется по времени модификации файлА, найденное файлО копируется куда заказано и, в качестве бонуса, на картинку ставится временной штамп, чтобы видно было, когда сделана фоточка.

#!/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()
view raw webcamfixer.py hosted with ❤ by GitHub

---
вон там внизу справа - таймштамп.


original post http://vasnake.blogspot.com/2014/07/webcamfixer.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)