Someimes you'd like to have 1,300 or so images loaded and filtered dynamically based on user input. That means, usually, 1,300 requests. With this simple script you could get arbitary amount of images from a server served together in one spritmap encoded to base64 and the coordinates from file name to X and Y positions on the map.
In the current state the script would resize all images to the same size as it fits my use case, but that should be quite easy to change.
python build_spritesheet_server.py --image_size=50 --images_path="./photos"
where image_size is the size the images would be resized to (currently only in ratio of 1:1), and images_path is the path to the folder containing the images.
Running the serer might take a while as it processes all images to memory before booting up the server to have quick response rate.
After the server is running you can query it:
example request:
curl localhost:9999/?ids=1784207670,1784515848,1777490990,1758354452
example response:
{"coordinates": {"1777490990": [0, 50], "1784207670": [0, 0], "1784515848": [50, 0], "1758354452": [50, 50]}, "error": null, "image": "b'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'"}
The response times are reasonably low with my local setup recording 200-300ms responses for a query of 400 pictures and <1000ms responses for 1,300 images.