use jpegtran to do lossless 90 rotations

This commit is contained in:
2023-11-11 21:28:04 +11:00
parent 62cfe6305e
commit 1005acb339
3 changed files with 23 additions and 11 deletions

View File

@@ -23,7 +23,7 @@ from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import scoped_session from sqlalchemy.orm import scoped_session
### LOCAL FILE IMPORTS ### ### LOCAL FILE IMPORTS ###
from shared import DB_URL, PA_JOB_MANAGER_HOST, PA_JOB_MANAGER_PORT, THUMBSIZE, SymlinkName, GenThumb, SECS_IN_A_DAY from shared import DB_URL, PA_JOB_MANAGER_HOST, PA_JOB_MANAGER_PORT, THUMBSIZE, SymlinkName, GenThumb, SECS_IN_A_DAY, PA_EXIF_ROTATER
from datetime import datetime, timedelta, date from datetime import datetime, timedelta, date
### PYTHON LIB IMPORTS ### ### PYTHON LIB IMPORTS ###
@@ -45,6 +45,7 @@ import face_recognition
import re import re
import sys import sys
import ffmpeg import ffmpeg
import subprocess
# global debug setting # global debug setting
@@ -1901,21 +1902,20 @@ def JobTransformImage(job):
amt=[jex.value for jex in job.extra if jex.name == "amt"][0] amt=[jex.value for jex in job.extra if jex.name == "amt"][0]
e=session.query(Entry).join(File).filter(Entry.id==id).first() e=session.query(Entry).join(File).filter(Entry.id==id).first()
print( f"JobTransformImage: job={job.id}, id={id}, amt={amt}" ) print( f"JobTransformImage: job={job.id}, id={id}, amt={amt}" )
im = Image.open( e.FullPathOnFS() )
if amt == "fliph": if amt == "fliph":
AddLogForJob(job, f"INFO: Flipping {e.FullPathOnFS()} horizontally" ) AddLogForJob(job, f"INFO: Flipping {e.FullPathOnFS()} horizontally" )
im = Image.open( e.FullPathOnFS() )
out = im.transpose(Image.FLIP_LEFT_RIGHT) out = im.transpose(Image.FLIP_LEFT_RIGHT)
out.save( e.FullPathOnFS() )
elif amt == "flipv": elif amt == "flipv":
AddLogForJob(job, f"INFO: Flipping {e.FullPathOnFS()} vertically" ) AddLogForJob(job, f"INFO: Flipping {e.FullPathOnFS()} vertically" )
im = Image.open( e.FullPathOnFS() )
out = im.transpose(Image.FLIP_TOP_BOTTOM) out = im.transpose(Image.FLIP_TOP_BOTTOM)
out.save( e.FullPathOnFS() )
else: else:
AddLogForJob(job, f"INFO: Rotating {e.FullPathOnFS()} by {amt} degrees" ) AddLogForJob(job, f"INFO: Rotating {e.FullPathOnFS()} by {amt} degrees" )
if im.format == 'JPEG': p = subprocess.run([PA_EXIF_ROTATER, e.FullPathOnFS(), amt ] )
im=ImageOps.exif_transpose(im)
out = im.rotate(int(amt), expand=True)
out.save( e.FullPathOnFS() )
print( f"JobTransformImage DONE transform: job={job.id}, id={id}, amt={amt}" )
settings = session.query(Settings).first() settings = session.query(Settings).first()
e.file_details.thumbnail, _ , _ = GenThumb( e.FullPathOnFS(), settings.auto_rotate ) e.file_details.thumbnail, _ , _ = GenThumb( e.FullPathOnFS(), settings.auto_rotate )
e.file_details.hash = md5( job, e ) e.file_details.hash = md5( job, e )

View File

@@ -40,17 +40,20 @@ OLDEST_LOG_LIMIT = 5
if hostname == "lappy": if hostname == "lappy":
PA_JOB_MANAGER_HOST="localhost" PA_JOB_MANAGER_HOST="localhost"
DB_URL = 'postgresql+psycopg2://pa:for_now_pa@localhost:5432/pa' DB_URL = 'postgresql+psycopg2://pa:for_now_pa@localhost:5432/pa'
PA_EXIF_ROTATER = './utils/pa_exifautotran' PA_EXIF_AUTOROTATE = './utils/pa_exifautotran'
PA_EXIF_ROTATER = './utils/pa_rotate'
# if we dont set the env or we are explicitly DEV, run web server on localhost & db on mara (port 65432) # if we dont set the env or we are explicitly DEV, run web server on localhost & db on mara (port 65432)
elif 'ENV' not in os.environ or os.environ['ENV'] == "development": elif 'ENV' not in os.environ or os.environ['ENV'] == "development":
PA_JOB_MANAGER_HOST="localhost" PA_JOB_MANAGER_HOST="localhost"
DB_URL = 'postgresql+psycopg2://pa:for_now_pa@mara.ddp.net:65432/pa' DB_URL = 'postgresql+psycopg2://pa:for_now_pa@mara.ddp.net:65432/pa'
PA_EXIF_ROTATER = './utils/pa_exifautotran' PA_EXIF_AUTOROTATE = './utils/pa_exifautotran'
PA_EXIF_ROTATER = './utils/pa_rotate'
# if we explicitly are on PROD, run web server on localhost (pa_web container) & db on mara (port 5432 on padb container)- only accessed via internal docker ports) # if we explicitly are on PROD, run web server on localhost (pa_web container) & db on mara (port 5432 on padb container)- only accessed via internal docker ports)
elif os.environ['ENV'] == "production": elif os.environ['ENV'] == "production":
PA_JOB_MANAGER_HOST="localhost" PA_JOB_MANAGER_HOST="localhost"
DB_URL = 'postgresql+psycopg2://pa:for_now_pa@padb/pa' DB_URL = 'postgresql+psycopg2://pa:for_now_pa@padb/pa'
PA_EXIF_ROTATER = '/code/utils/pa_exifautotran' PA_EXIF_AUTOROTATE = '/code/utils/pa_exifautotran'
PA_EXIF_ROTATER = '/code/utils/pa_rotate'
else: else:
print( "ERROR: I do not know which environment (development, etc.) and which DB (on which host to use)" ) print( "ERROR: I do not know which environment (development, etc.) and which DB (on which host to use)" )
exit( -1 ) exit( -1 )
@@ -132,7 +135,7 @@ def GenThumb(fname,auto_rotate):
im_orig = Image.open(fname) im_orig = Image.open(fname)
if im_orig.format == 'JPEG': if im_orig.format == 'JPEG':
# run cmdline util to re-orient jpeg (only changes if needed, and does it losslessly) # run cmdline util to re-orient jpeg (only changes if needed, and does it losslessly)
p = subprocess.run([PA_EXIF_ROTATER,fname] ) p = subprocess.run([PA_EXIF_AUTOROTATE,fname] )
im=Image.open(fname) im=Image.open(fname)
else: else:
im=im_orig im=im_orig

9
utils/pa_rotate Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/sh
echo "start"
b=`basename $1`
echo "b=$b"
mv $1 /tmp/$b
echo "mv $1 to /tmp/$b"
jpegtran -outfile $1 -rotate $2 /tmp/$b
echo "done jpegtran"