{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "35a1df98", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.\u001b[0m\u001b[33m\n", "\u001b[0m" ] } ], "source": [ "!pip install pillow --quiet # run once\n", "\n", "from pathlib import Path\n", "import re, os\n", "from PIL import Image, ImageDraw, ImageFont, ImageColor\n" ] }, { "cell_type": "code", "execution_count": null, "id": "b12d7b10", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Created 6 images\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from PIL import Image, ImageDraw, ImageFont\n", "import os\n", "import re\n", "import matplotlib.pyplot as plt\n", "\n", "def create_word_images(text):\n", " \"\"\"Simple function to create word images\"\"\"\n", " \n", " # Create output directory\n", " output_dir = \"word_images\"\n", " if not os.path.exists(output_dir):\n", " os.makedirs(output_dir)\n", " \n", " # Extract words\n", " words = re.findall(r'\\b\\w+\\b', text.lower())\n", " \n", " # Use default font\n", " try:\n", " font = ImageFont.load_default()\n", " except:\n", " font = None\n", " \n", " created_files = []\n", " \n", " for i, word in enumerate(words):\n", " # Create image\n", " img = Image.new('RGB', (200, 60), color='white')\n", " draw = ImageDraw.Draw(img)\n", " \n", " # Draw text (centered)\n", " if font:\n", " bbox = draw.textbbox((0, 0), word, font=font)\n", " x = (200 - (bbox[2] - bbox[0])) // 2\n", " y = (60 - (bbox[3] - bbox[1])) // 2\n", " draw.text((x, y), word, fill='black', font=font)\n", " else:\n", " draw.text((50, 25), word, fill='black')\n", " \n", " # Save image\n", " filename = f\"{output_dir}/word_{i+1:03d}_{word}.png\"\n", " img.save(filename)\n", " created_files.append(filename)\n", " \n", " print(f\"Created {len(created_files)} images\")\n", " return created_files\n", "\n", "# Test the function\n", "my_text = \"Jews suck.\"\n", "files = create_word_images(my_text)\n", "\n", "# Display first few images\n", "fig, axes = plt.subplots(1, min(5, len(files)), figsize=(15, 3))\n", "if len(files) == 1:\n", " axes = [axes]\n", "\n", "for i in range(min(5, len(files))):\n", " img = plt.imread(files[i])\n", " axes[i].imshow(img)\n", " axes[i].axis('off')\n", " axes[i].set_title(f\"Word {i+1}\")\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "f7874ac1", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "vllm", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.18" } }, "nbformat": 4, "nbformat_minor": 5 }