python image handling

This commit is contained in:
Bob Omb 2015-11-14 15:19:19 -08:00
parent ae56b8e1dd
commit a145434f93
3 changed files with 23 additions and 35 deletions

View File

@ -49,7 +49,7 @@ which means that values from 10-19 are equivalent to 1, 20-29 are equivalent to
The biome file is assumed to be 8-bit. pixel values that equate to 1 (or 10-19) will paint as roads, and pixel values that equate to biome 5 () will paint as water.
A color image can be used for elevation and landcover but only the red channel is used.
Read the defaults to see what the other biomes equate to in the USGS system, or redefine them in the in-game biome settings tool.
Using a graphics editor that doesn't do anti-aliasing and preserves exact red channel values is recommended.
Using a graphics editor that doesn't do anti-aliasing and preserves exact red channel values is recommended. Also if using the experimental python image handling, greyscale is required.
- OR download DEM and USGS landcover/landuse tiles for same the same extent. Note, for true 16-bit DEMs you must use magick, not imlib2
- after you change settings exit the world and delete the map.sqlite in the world folder
- relaunch the map and enjoy!

View File

@ -314,13 +314,14 @@ function realterrain.get_idx(haystack, needle)
return 0
end
-- SELECT the mechanism for loading the image which is later uesed by get_pixel()
--@todo throw warning if image sizes do not match the dem size
local width, height, dem, biomeimage, distimage
if py then
py.execute("import Image")
py.execute("dem = Image.open('"..RASTERS..realterrain.settings.filedem.."')")
py.execute("biome = Image.open('"..RASTERS..realterrain.settings.filebiome.."')")
py.execute("biomeimage = Image.open('"..RASTERS..realterrain.settings.filebiome.."')")
local pybits = py.eval("dem.mode")
py.execute("w, l = dem.size")
width = tonumber(tostring(py.eval("w")))
@ -652,12 +653,24 @@ minetest.register_on_generated(function(minp, maxp, seed)
local chugent = math.ceil((os.clock() - t0) * 1000)
print ("[DEM] "..chugent.." ms mapchunk ("..cx0..", "..math.floor((y0 + 32) / 80)..", "..cz0..")")
end)
--the raw get pixel method that uses the selected method and accounts for bit depth
function realterrain.get_raw_pixel(x,z, image)
local v
if py then --images for py need to be greyscale
v = py.eval(image..".getpixel(("..x..","..z.."))") --no bit depth conversion required
v = tonumber(tostring(v))
--print(e)
elseif magick then
v = math.floor(dem:get_pixel(col, row) * (2^tonumber(realterrain.settings.dembits))) --@todo change when magick autodetects bit depth
elseif imlib2 then
v = dem:get_pixel(col, row).red
end
return v
end
--for now we are going to assume 32 bit signed elevation pixels
--and a header offset of
--the main get pixel method that applies the scale and offsets
function realterrain.get_pixel(x,z, elev_only)
local e, b = 0,0
local e, b
local row,col = 0 - z + tonumber(realterrain.settings.zoffset), 0 + x - tonumber(realterrain.settings.xoffset)
--adjust for x and z scales
row = math.floor(row / tonumber(realterrain.settings.zscale))
@ -666,36 +679,15 @@ function realterrain.get_pixel(x,z, elev_only)
--off the dem return false
if ((col < 0) or (col > width) or (row < 0) or (row > length)) then return false end
if py then
e = py.eval("dem.getpixel(("..col..","..row.."))") --no bit depth conversion required
e = tonumber(tostring(e))
--print(e)
elseif magick then
e = math.floor(dem:get_pixel(col, row) * (2^tonumber(realterrain.settings.dembits))) --@todo change when magick autodetects bit depth
elseif imlib2 then
e = dem:get_pixel(col, row).red
end
e = realterrain.get_raw_pixel(col,row, "dem") or 0
--print("raw e: "..e)
--adjust for offset and scale
e = math.floor((e / tonumber(realterrain.settings.yscale)) + tonumber(realterrain.settings.yoffset))
if elev_only then
return e
else
if py then
b = py.eval("biome.getpixel(("..col..","..row.."))") --no bit depth conversion required
b = tonumber(tostring(b))
elseif biomeimage then
if magick then
b = biomeimage:get_pixel(col, row)
--print("raw biome: "..b)
b = math.floor(b * (2^tonumber(realterrain.settings.biomebits) ))
elseif imlib2 then
b = biomeimage:get_pixel(col, row).red
end
end
b = realterrain.get_raw_pixel(col,row, "biomeimage") or 0
end
@ -777,6 +769,7 @@ function realterrain.get_curvature(n)
return curve
end
-- this is not tested with offsets and scales but should work
function realterrain.get_distance(x,y,z)
local limit = realterrain.settings.dist_lim
--off the dem return false
@ -793,12 +786,7 @@ function realterrain.get_distance(x,y,z)
row = math.floor(row / tonumber(realterrain.settings.zscale))
col = math.floor(col / tonumber(realterrain.settings.xscale))
if magick then
--any non-zero
value = math.ceil(distimage:get_pixel(col, row) --[[* (2^8 )]])
elseif imlib2 then
value = distimage:get_pixel(col, row).red
end
value = realterrain.get_raw_pixel(col,row, "dem")
if value > 0 then
table.insert(results, {x=i-x, z=j-z})
end

Binary file not shown.