require"imlua" require"lfs" function PrintError(error) local msg = {} msg[im.ERR_OPEN] = "Error Opening File." msg[im.ERR_MEM] = "Insuficient memory." msg[im.ERR_ACCESS] = "Error Accessing File." msg[im.ERR_DATA] = "Image type not Suported." msg[im.ERR_FORMAT] = "Invalid Format." msg[im.ERR_COMPRESS] = "Invalid or unsupported compression." if msg[error] then print(msg[error]) else print("Unknown Error.") end end function FindZero(data) if (not data) then return false end for i = 1, table.getn(data) do if data[i] == 0 then return true end end return false end function AttribData2Str(data, data_type) local data_str if data_type == im.BYTE then data_str = string.format("%3d", data[1]) elseif data_type == im.USHORT then data_str = string.format("%5d", data[1]) elseif data_type == im.INT then data_str = string.format("%5d", data[1]) elseif data_type == im.FLOAT then data_str = string.format("%5.2f", data[1]) elseif data_type == im.CFLOAT then data_str = string.format("%5.2f, %5.2f", data[1], data[2]) end return data_str end function GetSizeDesc(size) local size_desc if size < 1024 then size_desc = "b" else size = size / 1024 if size < 1024 then size_desc = "Kb" else size = size / 1024 size_desc = "Mb" end end return size, size_desc end function FileSize(file_name) if lfs then local attr = lfs.attributes(file_name) return attr.size else return 0 end end function PrintImageInfo(file_name) print("IM Info") print(string.format(" File Name:\n %s", file_name)) local ifile, error = im.FileOpen(file_name) if not ifile then PrintError(error) return nil end local file_size = FileSize(file_name) print(string.format(" File Size: %.2f %s", GetSizeDesc(file_size))) local format, compression, image_count = ifile:GetInfo() local error, format_desc = im.FormatInfo(format) print(string.format(" Format: %s - %s", format, format_desc)) print(string.format(" Compression: %s", compression)) print(string.format(" Image Count: %d", image_count)) for i = 1, image_count do local error, width, height, color_mode, data_type = ifile:ReadImageInfo(i-1) if width == nil then PrintError(height) ifile:Close() return nil end print(string.format(" Image #%d", i)) print(string.format(" Width: %d", width)) print(string.format(" Height: %d", height)) print(string.format(" Color Space: %s", im.ColorModeSpaceName(color_mode))) print(string.format(" Has Alpha: %s", im.ColorModeHasAlpha(color_mode) and "Yes" or "No")) print(string.format(" Is Packed: %s", im.ColorModeIsPacked(color_mode) and "Yes" or "No")) print(string.format(" Is Top Down: %s", im.ColorModeIsTopDown(color_mode) and "Yes" or "No")) print(string.format(" Data Type: %s", im.DataTypeName(data_type))) local image_size = im.ImageDataSize(width, height, color_mode, data_type) print(string.format(" Data Size: %.2f %s", GetSizeDesc(image_size))) local attrib_list = ifile:GetAttributeList() for a = 1, table.getn(attrib_list) do if a == 1 then print(" Attributes:") end local attrib_data, attrib_data_type = ifile:GetAttribute(attrib_list[a]) if table.getn(attrib_data) == 1 then print(string.format(" %s: %s", attrib_list[a], AttribData2Str(attrib_data, attrib_data_type))) elseif attrib_data_type == im.BYTE and FindZero(attrib_data) then attrib_data = ifile:GetAttribute(attrib_list[a], true) print(string.format(" %s: %s", attrib_list[a], attrib_data)) else print(string.format(" %s: %s ...", attrib_list[a], AttribData2Str(attrib_data, attrib_data_type))) end end end ifile:Close() end function main(arg) if (not arg or table.getn(arg) < 1) then print("Invalid number of arguments.") return nil end PrintImageInfo(arg[1]) return 1 end main(arg) --PrintImageInfo("lena.jpg")