File size: 11,560 Bytes
4f77f87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
{
 "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": [
       "<Figure size 1500x300 with 5 Axes>"
      ]
     },
     "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
}