luaforwindows/files/examples/im/combine4-10x15.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()