146 lines
3.4 KiB
Lua
146 lines
3.4 KiB
Lua
--A script to compose 4 images
|
|
|
|
require"imlua"
|
|
require"imlua_process"
|
|
require"iuplua"
|
|
|
|
|
|
function CombineImages(comb_image)
|
|
local w = comb_image:Width()-offset
|
|
local h = comb_image:Height()-offset
|
|
local half_w = math.floor(w/2)
|
|
local half_h = math.floor(h/2)
|
|
local x = {0, 0, half_w+offset, half_w+offset}
|
|
local y = {0, half_h+offset, 0, half_h+offset}
|
|
|
|
for i = 1, 4 do
|
|
local img_w = images[i]:Width()
|
|
local img_h = images[i]:Height()
|
|
|
|
if (img_w ~= half_w or img_h ~= half_h) then
|
|
local rz_w, rz_h, img_aspect
|
|
|
|
img_aspect = img_w/img_h
|
|
|
|
-- keep image aspect ratio
|
|
if (img_aspect ~= aspect) then
|
|
if (img_aspect < aspect) then
|
|
rz_h = half_h
|
|
rz_w = math.floor(rz_h * img_aspect)
|
|
else
|
|
rz_w = half_w
|
|
rz_h = math.floor(rz_w / img_aspect)
|
|
end
|
|
else
|
|
rz_w = half_w
|
|
rz_h = half_h
|
|
end
|
|
|
|
if (img_w ~= rz_w or img_h ~= rz_h) then
|
|
resize_image = im.ImageCreate(rz_w, rz_h, im.RGB, im.BYTE)
|
|
im.ProcessResize(images[i], resize_image, 1) -- do bilinear interpolation
|
|
images[i]:Destroy()
|
|
images[i] = resize_image
|
|
end
|
|
end
|
|
|
|
im.ProcessInsert(comb_image, images[i], comb_image, x[i], y[i]) -- insert resize in dst and place the result in dst
|
|
end
|
|
end
|
|
|
|
function Save_Combine_Image(comb_image)
|
|
local i=0
|
|
local filename
|
|
repeat
|
|
i=i+1
|
|
local num=1000+i
|
|
numstr=string.sub(tostring(num),-3)
|
|
filename = "..\\combine"..numstr..".jpg"
|
|
-- check if exists
|
|
local res,msg=io.open(filename)
|
|
io.close()
|
|
until not res
|
|
print("Saving:", filename)
|
|
comb_image:Save(filename, "JPEG")
|
|
os.execute(filename)
|
|
end
|
|
|
|
function LoadImages()
|
|
local max_w, max_h = 0, 0
|
|
for i = 1, 4 do
|
|
if (not files[i]) then
|
|
error("Error, must drop 4 files.")
|
|
end
|
|
print("Loading:", files[i])
|
|
images[i] = im.FileImageLoadBitmap(files[i])
|
|
if (not images[i]) then
|
|
error("Failed to load image: "..files[i])
|
|
end
|
|
local img_w = images[i]:Width()
|
|
local img_h = images[i]:Height()
|
|
if (img_w < img_h) then
|
|
-- always landscape (w>h)
|
|
local rot_image = im.ImageCreate(img_h, img_w, im.RGB, im.BYTE)
|
|
im.ProcessRotate90(images[i], rot_image, true)
|
|
images[i]:Destroy()
|
|
images[i] = rot_image
|
|
local t = img_w
|
|
img_w = img_h
|
|
img_h = t
|
|
end
|
|
if (max_w < img_w) then max_w = img_w end
|
|
if (max_h < img_h) then max_h = img_h end
|
|
end
|
|
return max_w, max_h
|
|
end
|
|
|
|
function ReleaseAll(comb_image)
|
|
comb_image:Destroy()
|
|
for i = 1, 4 do
|
|
images[i]:Destroy()
|
|
images[i] = nil
|
|
files[i] = nil
|
|
end
|
|
end
|
|
|
|
--Script Starts
|
|
|
|
files = {}
|
|
images = {}
|
|
aspect = 15/10
|
|
offset = 20
|
|
|
|
dlg = iup.dialog{
|
|
iup.label{title="Drop here 4 photos."},
|
|
title="Combine",
|
|
size="150x50"}
|
|
|
|
function dlg:dropfiles_cb(filename, num)
|
|
files[num+1] = filename
|
|
if (num == 0) then
|
|
local max_w, max_h = LoadImages()
|
|
local w, h = 2*max_w+offset, 2*max_h+offset
|
|
|
|
if (w/h ~= aspect) then
|
|
if (w/h < aspect) then
|
|
w = h * aspect
|
|
else
|
|
h = w / aspect
|
|
end
|
|
end
|
|
|
|
print("Combining...")
|
|
local comb_image = im.ImageCreate(w, h, im.RGB, im.BYTE)
|
|
-- white background
|
|
im.ProcessRenderConstant(comb_image, {255, 255, 255})
|
|
CombineImages(comb_image)
|
|
|
|
Save_Combine_Image(comb_image)
|
|
|
|
ReleaseAll(comb_image)
|
|
end
|
|
end
|
|
|
|
dlg:show()
|
|
iup.MainLoop()
|