Updated png-it.py, now it has --autocrop option.
This commit is contained in:
@@ -27,6 +27,9 @@ def main():
|
||||
parser.add_option('--center', '-e', help = 'Mark what will be the center of the image, two percentage values comma separated',\
|
||||
metavar = '<center>', type = str, dest = 'center', default = None)
|
||||
|
||||
parser.add_option('--autocrop', '-a', help = 'Calculates the center and crop vales automatically to show all the tiles in the minimun image size.Unless you want a very specific image this options is very recommendedable.',\
|
||||
action = 'store_true', dest = 'autocrop', default = False)
|
||||
|
||||
parser.add_option('--output', '-o', help = 'Path for the resulting PNG. It will save it as PNG, no matter what extension do you use.',\
|
||||
metavar = '<output>', type = str, dest = 'output', default = "output.png")
|
||||
|
||||
@@ -43,6 +46,9 @@ def main():
|
||||
if not options.zoom_level:
|
||||
parser.error("Error! The option zoom-level is mandatory.")
|
||||
|
||||
if options.autocrop and (options.center or options.crop):
|
||||
parser.error("Error! You can't mix --autocrop with --center or --crop.")
|
||||
|
||||
# check for the output
|
||||
folder, filename = split(options.output)
|
||||
if folder != '' and not exists(folder):
|
||||
@@ -54,8 +60,50 @@ def main():
|
||||
tile_size = (384,384)
|
||||
px_size = 4 # bytes
|
||||
|
||||
# the vector that joins the center tile with the new center tile in
|
||||
# tile coords (tile coords is how many tile are on the left, x, and
|
||||
# create a list with all the images in the zoom level
|
||||
path = tileset
|
||||
for i in range(options.zoom_level):
|
||||
path = join(path, "?")
|
||||
path += ".png"
|
||||
|
||||
all_images = glob(path)
|
||||
if not all_images:
|
||||
"Error! No images found in this zoom leve. Is this really an overviewer tile set directory?"
|
||||
sys.exit(1)
|
||||
|
||||
# autocrop will calculate the center and crop values automagically
|
||||
if options.autocrop:
|
||||
min_x = min_y = length_in_tiles
|
||||
max_x = max_y = 0
|
||||
counter = 0
|
||||
total = len(all_images)
|
||||
print "Checking tiles for autocrop calculations:"
|
||||
# get the maximun and minimun tiles coordinates of the map
|
||||
for path in all_images:
|
||||
t = get_tuple_coords(options, path)
|
||||
c = get_tile_coords_from_tuple(options, t)
|
||||
min_x = min(min_x, c[0])
|
||||
min_y = min(min_y, c[1])
|
||||
max_x = max(max_x, c[0])
|
||||
max_y = max(max_y, c[1])
|
||||
counter += 1
|
||||
if (counter % 100 == 0 or counter == total or counter == 1): print "Checked {0} of {1}".format(counter, total)
|
||||
|
||||
# the center of the map will be in the middle of the occupied zone
|
||||
center = (int((min_x + max_x)/2.), int((min_y + max_y)/2.))
|
||||
# see the next next comment to know what's center_vector
|
||||
center_vector = (int(center[0] - (length_in_tiles/2. - 1)), int(center[1] - (length_in_tiles/2. - 1)))
|
||||
# I'm not completely sure why, but the - 1 factor in ^ makes everything nicer.
|
||||
|
||||
# min_x - center_vector[0] will be the unused amount of tiles in
|
||||
# the left and the right of the map (and this is true because we
|
||||
# are in the actual center of the map)
|
||||
crop = (min_x - center_vector[0], min_y - center_vector[1])
|
||||
|
||||
else:
|
||||
# center_vector is the vector that joins the center tile with
|
||||
# the new center tile in tile coords
|
||||
#(tile coords are how many tile are on the left, x, and
|
||||
# how many above, y. The top-left tile has coords (0,0)
|
||||
if options.center:
|
||||
center_x, center_y = options.center.split(",")
|
||||
@@ -67,6 +115,7 @@ def main():
|
||||
else:
|
||||
center_vector = (0,0)
|
||||
|
||||
# crop if needed
|
||||
tiles_to_crop = int(2**n*(options.crop/100.))
|
||||
crop = (tiles_to_crop, tiles_to_crop)
|
||||
|
||||
@@ -80,17 +129,6 @@ def main():
|
||||
print "Warning! The expected RAM usage exceeds the spicifyed limit. Exiting."
|
||||
sys.exit(1)
|
||||
|
||||
# create a list with all the images in the zoom level
|
||||
path = tileset
|
||||
for i in range(options.zoom_level):
|
||||
path = join(path, "?")
|
||||
path += ".png"
|
||||
|
||||
all_images = glob(path)
|
||||
if not all_images:
|
||||
"Error! No images found in this zoom leve. Is this really an overviewer tile set directory?"
|
||||
sys.exit(1)
|
||||
|
||||
# Create a new huge image
|
||||
final_img = Image.new("RGBA", final_cropped_img_size, (26, 26, 26, 0))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user