diff options
author | scuri <scuri> | 2010-02-16 03:05:52 +0000 |
---|---|---|
committer | scuri <scuri> | 2010-02-16 03:05:52 +0000 |
commit | 7bc01229e8f5431766e1a0a639347ba626c3c196 (patch) | |
tree | aeb8288293256491c776b67df35ab84106981eaf /html/examples/combine4-10x15.lua | |
parent | c66bdf38311b21bd8c01a814be6e25ede8ec4beb (diff) |
*** empty log message ***
Diffstat (limited to 'html/examples/combine4-10x15.lua')
-rw-r--r-- | html/examples/combine4-10x15.lua | 145 |
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() |