Hi,
I reworked the whole script. It is more sophisticated and robust now. Main
change is an optional resizing of the pictures to reduce the pdf file size. It
works evry well for me
Usage: do_contactsheet-test.lua [OPTION] <fullpath to jpg/png>
Options:
-t|--title <txt> Title of the document (default: "Contactsheet")
-c|--count <num> number of pictures per line (default. 4)
-d|--debug turn on debug modus (default: off).
-h|--help print this usage message
-r|--resize turn on resizing pictures to 150 dpi. (default:
off)
This script creates a contactsheet.pdf in the current directory. It depends on
"lualatex" to create the pdf file.
It expects the full path names to the pictures on the commandline.
If resizing is turned on, the script resizes the thumbs to 150 dpi. This
reduces the pdf file size dramatically.
Example:
132 pictures with 20 MBit resolution (mixed landscape and portrait)
7 pages pdf
pdf size without resizing: 376 MB
pdf size with resizing: 5 MB
temp folder for the thumbs: 5 MB
avg. size orig. jpg's: 2.8 MB
avg. size thumbs: 40 kB
resizing took 134 seconds on a i7-2600K CPU @ 3.40GHz
The script stores the resized thumbs in a temporary directory in /tmp. This
directory is deleted on exit.
If debug is turned on this directory is not deleted. The script depends on the
"convert" tool from the ImageMagick package to do the resizing.
Please try it out and give me some feedback.
Matthias
Here is the script:
-------------------
#!/usr/bin/lua
-- do_contactsheet.lua creates a contact sheet (Kontakabzug) for a set of
pictures
-- it uses LaTeX to create a PDF document
-- it supports JPG and PNG files
-- version 1.1
-- (c) Matthias Bodenbinder, May 2015
-- default values
title = "Contactsheet"
thumbs_per_line = 4
resize = false
debug = false
-- width per picture = w*\textwidth
w = 1/thumbs_per_line - 0.01;
-- pixel width per picture assuming 150 dpi
pxl = math.floor(20/thumbs_per_line / 2.54 * 150)
-- LaTeX preamble
tex_start= [[\documentclass[a4paper,10pt]{article}
\usepackage{graphicx}
\usepackage{fontspec}
\usepackage{hyperref}
\pagestyle{empty}
\parindent0pt
\parskip1em
\usepackage{geometry}
\geometry{a4paper,left=5mm,right=5mm, top=5mm, bottom=5mm}
\begin{document}
]]
-- place all thumbnails
function thumbnails()
for i,v in ipairs(pictures) do
local thumbfile = resize_image(i)
-- mask the underscores for the labels
local label = string.gsub(filenames[i],"_", "\\_")
io.write("\\begin{minipage}[b]{" .. w .. "\\textwidth}\n" ..
" \\includegraphics[width=\\textwidth]{" .. thumbfile ..
"}\\newline\n" ..
" \\centering{\\footnotesize\\href{run:" .. pictures[i] ..
"}{\\texttt{" .. i .. ": " .. label .. "}}}\n" ..
"\\end{minipage}\n")
if( i % thumbs_per_line == 0 ) then
-- new line
io.write("\\par")
else
io.write("\\hspace{1mm}")
end
end
end
function resize_image(i)
-- i = index of picture in pictures and filenames
fullname = pictures[i]
if( not resize ) then
-- if we do not resize we include the original images
return(fullname)
end
smallfile = tmpdir .. "/" .. filenames[i]
debug_msg("% convert -resize " .. pxl .. " " .. fullname .. " " ..
smallfile)
os.execute("convert -resize " .. pxl .. " " .. fullname .. " " ..
smallfile)
return(smallfile)
end
function usage()
print("Usage: " .. arg[0] .. " [OPTION] <fullpath to jpg/png>")
msg = [[
Version: 1.1
Options:
-t|--title <txt> Title of the document (default: "Contactsheet")
-c|--count <num> number of pictures per line (default. 4)
-d|--debug turn on debug modus (default: off).
-h|--help print this usage message
-r|--resize turn on resizing pictures to 150 dpi. (default:
off)
This script creates a contactsheet.pdf in the current directory. It depends on
"lualatex" to create the pdf file.
It expects the full path names to the pictures on the commandline.
If resizing is turned on, the script resizes the thumbs to 150 dpi. This
reduces the pdf file size dramatically.
Example:
132 pictures with 20 MBit resolution (mixed landscape and portrait)
7 pages pdf
pdf size without resizing: 376 MB
pdf size with resizing: 5 MB
temp folder for the thumbs: 5 MB
avg. size orig. jpg's: 2.8 MB
avg. size thumbs: 40 kB
resizing took 134 seconds on a i7-2600K CPU @ 3.40GHz
The script stores the resized thumbs in a temporary directory in /tmp. This
directory is deleted on exit.
If debug is turned on this directory is not deleted. The script depends on the
"convert" tool from the ImageMagick package to do the resizing.
]]
print(msg)
end
function debug_msg(s)
if( debug ) then
print(s)
end
end
-- main loop
pictures = {}
filenames = {}
pcount = 0
i = 1
-- parse commandline
while i <= #arg do
if( arg[i] == "-t" or arg[i] == "--title" ) then
title = arg[i+1];
i=i+1
elseif( arg[i] == "-c" or arg[i] == "--count" ) then
thumbs_per_line = arg[i+1];
w = 1/thumbs_per_line - 0.01;
pxl = math.floor(20/thumbs_per_line / 2.54 * 150)
i=i+1
elseif( arg[i] == "-r" or arg[i] == "--resize" ) then
resize = true
elseif( arg[i] == "-h" or arg[i] == "--help" ) then
usage()
os.exit()
elseif( arg[i] == "-d" or arg[i] == "--debug" ) then
debug = true
else
table.insert(pictures, arg[i])
end
i=i+1
end
-- print global variables
debug_msg("% title= " .. title)
debug_msg("% thumbs_per_line= " .. thumbs_per_line .. "; w= " .. w)
debug_msg("% pxl= " .. pxl)
-- create random directory
if( resize ) then
math.randomseed(os.time())
suffix = math.random(9999999)
tmpdir = "/tmp/lua" .. suffix
debug_msg("% resize= true")
debug_msg("% tmpdir= " .. tmpdir)
os.execute("mkdir -p " .. tmpdir .. " >/dev/null")
else
debug_msg("% resize= false")
end
for k,v in ipairs(pictures) do
-- store filenames
-- remove leading path
t = string.gsub(v, ".*/", "")
table.insert(filenames, t)
debug_msg("% pic " .. k .. "= " .. v .. " = " .. t)
end
-- check for lualatex and exit if it does not exist
if( not os.execute("which lualatex >/dev/null") )then
debug_msg("lualatex not found. Aborting!")
os.exit()
end
-- check for convert and exit if it does not exist
if( resize and not os.execute("which convert >/dev/null") )then
print("convert not found. Please install ImageMagick. Aborting!")
os.exit()
end
-- write tex file to /tmp
basefile = "/tmp/contactsheet"
texfile = basefile .. ".tex"
pdffile = basefile .. ".pdf"
-- output routines
f = io.output(texfile, "w")
io.write(tex_start)
io.write("{\\Large\\bfseries " .. title .. "}\\par\n")
thumbnails()
io.write("\\end{document}")
io.close()
-- excute lualatex to create pdf file
debug_msg("% running lualatex")
os.execute("cd /tmp; lualatex --interaction=batchmode " .. texfile .. ">
/dev/null")
-- move pdf to current folder
if( not os.execute("mv " .. pdffile .. " .") ) then
print("Error moving pdf file: " .. pdffile)
end
-- cleanup
if( resize and not debug ) then
os.execute("rm -rf " .. tmpdir)
end
-- end of script
------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
darktable-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/darktable-devel