| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | local gm = require 'graphicsmagick'require 'pl'local image_loader = {}function image_loader.decode_float(blob)   local im = image_loader.decode_byte(blob)   if im then      im = im:float():div(255)   end   return imendfunction image_loader.encode_png(tensor)   local im = gm.Image(tensor, "RGB", "DHW")   im:format("png")   return im:toBlob()endfunction image_loader.decode_byte(blob)   local load_image = function()      local im = gm.Image()      im:fromBlob(blob, #blob)      -- FIXME: How to detect that a image has an alpha channel?      if blob:sub(1, 4) == "\x89PNG" or blob:sub(1, 3) == "GIF" then	 -- merge alpha channel	 im = im:toTensor('float', 'RGBA', 'DHW')	 local w2 = im[4]	 local w1 = im[4] * -1 + 1	 local new_im = torch.FloatTensor(3, im:size(2), im:size(3))	 -- apply the white background	 new_im[1]:copy(im[1]):cmul(w2):add(w1)	 new_im[2]:copy(im[2]):cmul(w2):add(w1)	 new_im[3]:copy(im[3]):cmul(w2):add(w1)	 im = new_im:mul(255):byte()      else	 im = im:toTensor('byte', 'RGB', 'DHW')      end      return im   end   local state, ret = pcall(load_image)   if state then      return ret   else      return nil   endendfunction image_loader.load_float(file)   local fp = io.open(file, "rb")   local buff = fp:read("*a")   fp:close()   return image_loader.decode_float(buff)endfunction image_loader.load_byte(file)   local fp = io.open(file, "rb")   local buff = fp:read("*a")   fp:close()   return image_loader.decode_byte(buff)endlocal function test()   require 'image'   local img   img = image_loader.load_float("./a.jpg")   if img then      print(img:min())      print(img:max())      image.display(img)   end   img = image_loader.load_float("./b.png")   if img then      image.display(img)   endend--test()return image_loader
 |