Compare commits

..

No commits in common. "5a02d07a11b38db2744b6dfc39f88481fa518a57" and "05652369ad70b62b8047f313fab57a7bece7f846" have entirely different histories.

4 changed files with 1 additions and 152 deletions

View File

@ -6,34 +6,11 @@ Fun proof of concept to generate random wildlife bingo cards for safaris with da
</p> </p>
# Usage # Usage
Once the requirements are satisfied you can generate a card. By default it generates a 4x4 grid with 16 images:
```console ```console
$ ./generate.py -i data/animals.csv -o out.jpg $ ./generate.py -i data/animals.csv -o out.jpg
[INFO] Generated random sample of 32 animals...
[INFO] > Creating thumbnail for Helmeted guineafowl...
[INFO] Generated card with a 4x4 grid of animals...
[INFO] Wrote out.jpg
``` ```
The script will download the images from Wikipedia, generate thumbnails for the sampled animals, and output a bingo card as a JPEG file.
# Requirements
Set up a Python 3.11+ virtual environment and install the requirements:
```console
$ python3 -m .venv
$ source .venv/bin/activate
$ pip install -r requirements.lock
```
# TODO
- Credit photographers — these photos are all some variation of CC-BY so we need to give attribution
- Add filtering by region — the metadata already exists, though perhaps needs to be adjusted
- Refactor — perhaps needs to be more object oriented
- Make a web frontend — I can imagine a light frontend that would shuffle the images in realtime and allow generation of a number of cards
# License # License
This work is licensed under the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html). This work is licensed under the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html).

View File

@ -155,8 +155,8 @@ if __name__ == "__main__":
# Get a random list of animal IDs. We will build a square grid using the # Get a random list of animal IDs. We will build a square grid using the
# "across" parameter passed by the user. # "across" parameter passed by the user.
logger.info(f"Generating random sample of {animals_df.shape[0]} animals...")
animal_ids = animals_df["id"].sample(args.across * args.across) animal_ids = animals_df["id"].sample(args.across * args.across)
logger.info(f"Generated random sample of {animals_df.shape[0]} animals...")
# Slice those random animals from the dataframe # Slice those random animals from the dataframe
animals_df_random = animals_df[animals_df["id"].isin(animal_ids)] animals_df_random = animals_df[animals_df["id"].isin(animal_ids)]
@ -174,7 +174,6 @@ if __name__ == "__main__":
# Join all thumbnails together in an array of x across with a padding of 2 # Join all thumbnails together in an array of x across with a padding of 2
# pixels between each square. # pixels between each square.
joined = pyvips.Image.arrayjoin(thumbnails, across=args.across, shim=2) joined = pyvips.Image.arrayjoin(thumbnails, across=args.across, shim=2)
logger.info(f"Generated card with a {args.across}x{args.across} grid of animals...")
joined.jpegsave(args.output_file, optimize_coding=True, strip=True) joined.jpegsave(args.output_file, optimize_coding=True, strip=True)
logger.info(f"Wrote {args.output_file}") logger.info(f"Wrote {args.output_file}")

View File

@ -1,85 +0,0 @@
# generated by rye
# use `rye lock` or `rye sync` to update this lockfile
#
# last locked with the following flags:
# pre: false
# features: []
# all-features: false
# with-sources: false
-e file:.
asttokens==2.4.1
# via stack-data
black==24.2.0
certifi==2024.2.2
# via requests
cffi==1.16.0
# via pyvips
charset-normalizer==3.3.2
# via requests
click==8.1.7
# via black
colorama==0.4.6
# via safari-bingo-cards
decorator==5.1.1
# via ipython
executing==2.0.1
# via stack-data
idna==3.6
# via requests
ipython==8.22.1
isort==5.13.2
jedi==0.19.1
# via ipython
matplotlib-inline==0.1.6
# via ipython
mypy-extensions==1.0.0
# via black
numpy==1.26.4
# via pandas
packaging==23.2
# via black
pandas==2.2.1
# via safari-bingo-cards
parso==0.8.3
# via jedi
pathspec==0.12.1
# via black
pexpect==4.9.0
# via ipython
pkgconfig==1.5.5
# via pyvips
platformdirs==4.2.0
# via black
prompt-toolkit==3.0.43
# via ipython
ptyprocess==0.7.0
# via pexpect
pure-eval==0.2.2
# via stack-data
pycparser==2.21
# via cffi
pygments==2.17.2
# via ipython
python-dateutil==2.8.2
# via pandas
pytz==2024.1
# via pandas
pyvips==2.2.2
# via safari-bingo-cards
requests==2.31.0
# via safari-bingo-cards
six==1.16.0
# via asttokens
# via python-dateutil
stack-data==0.6.3
# via ipython
traitlets==5.14.1
# via ipython
# via matplotlib-inline
tzdata==2024.1
# via pandas
urllib3==2.2.1
# via requests
wcwidth==0.2.13
# via prompt-toolkit

View File

@ -1,42 +0,0 @@
# generated by rye
# use `rye lock` or `rye sync` to update this lockfile
#
# last locked with the following flags:
# pre: false
# features: []
# all-features: false
# with-sources: false
-e file:.
certifi==2024.2.2
# via requests
cffi==1.16.0
# via pyvips
charset-normalizer==3.3.2
# via requests
colorama==0.4.6
# via safari-bingo-cards
idna==3.6
# via requests
numpy==1.26.4
# via pandas
pandas==2.2.1
# via safari-bingo-cards
pkgconfig==1.5.5
# via pyvips
pycparser==2.21
# via cffi
python-dateutil==2.8.2
# via pandas
pytz==2024.1
# via pandas
pyvips==2.2.2
# via safari-bingo-cards
requests==2.31.0
# via safari-bingo-cards
six==1.16.0
# via python-dateutil
tzdata==2024.1
# via pandas
urllib3==2.2.1
# via requests