summaryrefslogtreecommitdiff
path: root/html/examples/combine4-10x15.lua
diff options
context:
space:
mode:
Diffstat (limited to 'html/examples/combine4-10x15.lua')
-rw-r--r--html/examples/combine4-10x15.lua145
1 files changed, 145 insertions, 0 deletions
diff --git a/html/examples/combine4-10x15.lua b/html/examples/combine4-10x15.lua
new file mode 100644
index 0000000..6460bce
--- /dev/null
+++ b/html/examples/combine4-10x15.lua
@@ -0,0 +1,145 @@
+--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()