from PIL import Image, ImageDraw, ImageFont
import os
# Font size and image dimensions
font_size = 88
width = 640
height = 480
# Use Symbola.ttf from current directory
font_path = "Symbola.ttf"
# Create image
img = Image.new('RGB', (width, height), color='white')
draw = ImageDraw.Draw(img)
# Get font
font = ImageFont.truetype(font_path, font_size)
# Emoji matrix
emoji_matrix = [
['😀', '😁', '😂', '🤣', '😃'],
['😄', '😅', '😆', '😇', '😈'],
['😉', '😊', '😋', '😌', '😍'],
['😎', '😏', '😐', '😑', '😒']
]
# Calculate spacing
x_spacing = font_size + 10
y_spacing = font_size + 10
# Calculate starting position to center the grid
start_x = (width - (len(emoji_matrix[0]) * x_spacing)) // 2
start_y = (height - (len(emoji_matrix) * y_spacing)) // 2
# Draw emojis
for i, row in enumerate(emoji_matrix):
for j, emoji in enumerate(row):
x = start_x + (j * x_spacing)
y = start_y + (i * y_spacing)
draw.text((x, y), emoji, font=font, fill='black')
# Save the image
img.save('emoji_art.png')
print("Emoji art has been created successfully! Check emoji_art.png")
Is a blog about python programming language. You can see my work with python programming language, tutorials and news.
Sunday, November 24, 2024
Python 3.13.0 : emoji symbols with PIL.
Wednesday, November 20, 2024
Python 3.13.0 : generates multiple deformed polygonal shapes .
#!/usr/bin/env python3
"""
SVG Polygon Generator
This script generates multiple deformed polygonal shapes and saves them as separate SVG files.
Each polygon maintains convex properties while having controlled random deformations.
Features:
- Generates 8 unique polygonal shapes
- Controls deformation through radial and angular factors
- Maintains convex properties
- Exports each shape to a separate SVG file
- Uses random colors for visual distinction
Usage:
python generate_svgs.py
Output:
Creates 8 SVG files named 'polygon_1.svg' through 'polygon_8.svg'
"""
from lxml import etree
import random
import math
from pathlib import Path
def create_svg_root():
"""Create and return a base SVG root element with standard attributes."""
root = etree.Element("svg")
root.set("width", "500")
root.set("height", "500")
root.set("xmlns", "http://www.w3.org/2000/svg")
return root
def calculate_points(center_x: float, center_y: float, radius: float,
num_sides: int, deform_factor: float) -> list:
"""
Calculate polygon points with controlled deformation.
Args:
center_x: X coordinate of polygon center
center_y: Y coordinate of polygon center
radius: Base radius of the polygon
num_sides: Number of polygon sides
deform_factor: Maximum allowed deformation factor
Returns:
List of tuples containing (x, y) coordinates
"""
points = []
angle_step = 2 * math.pi / num_sides
for i in range(num_sides):
angle = i * angle_step
radial_deform = random.uniform(-deform_factor, deform_factor)
angular_deform = random.uniform(-deform_factor/2, deform_factor/2)
modified_angle = angle + angular_deform
modified_radius = radius * (1 + radial_deform)
x = center_x + modified_radius * math.cos(modified_angle)
y = center_y + modified_radius * math.sin(modified_angle)
points.append((x, y))
return points
def generate_deformed_shapes():
"""Generate multiple deformed polygons and save them to separate SVG files."""
# Base parameters
num_sides = 8
center_x = 250
center_y = 250
base_radius = 150
max_deformation = 0.15
output_dir = Path("generated_polygons")
# Create output directory if it doesn't exist
output_dir.mkdir(exist_ok=True)
for i in range(8):
root = create_svg_root()
points = calculate_points(center_x, center_y, base_radius,
num_sides, max_deformation)
path = etree.SubElement(root, "path")
path_data = f"M {points[0][0]} {points[0][1]}"
path_data += "".join(f" L {p[0]} {p[1]}" for p in points[1:])
path_data += " Z"
path.set("d", path_data)
path.set("fill", "none")
path.set("stroke", f"#{random.randint(0, 16777215):06X}")
path.set("stroke-width", "2")
path.set("opacity", "0.7")
# Save individual SVG file
output_file = output_dir / f"polygon_{i+1}.svg"
tree = etree.ElementTree(root)
tree.write(str(output_file), pretty_print=True,
xml_declaration=True, encoding='utf-8')
print(f"Generated {num_sides} polygons in {output_dir}")
if __name__ == "__main__":
generate_deformed_shapes()
Saturday, August 15, 2020
Python 3.8.5 : The hashlib python package - part 001.
The official webpage comes for this python package has this intro:
This module implements a common interface to many different secure hash and message digest algorithms. Included are the FIPS secure hash algorithms SHA1, SHA224, SHA256, SHA384, and SHA512 (defined in FIPS 180-2) as well as RSA’s MD5 algorithm (defined in Internet RFC 1321).
The example source code to test a simple hash is this:
import hashlib
import os
def file_sha1(filename):
BUF_SIZE = 65536 # read stuff in 64kb chunks!
get_sha1 = hashlib.sha1()
with open(filename, 'rb') as f:
while True:
data = f.read(BUF_SIZE)
if not data:
break
get_sha1.update(data)
return get_sha1.hexdigest()
# I add this comment after first to see the hash difference.
files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
h = file_sha1(f)
print(h)
Let's test the source code with the default directory and two files.I run it first with default source code and then I add a comment to test_hash_file.py file.
You can see the hash is changed from b222523567a8a806382b86578717ddbd00e0f4b4 to 2134660551cc67812413a3a75fd12efb05d591ef.
[mythcat@desk Projects_Python]$ ls
test_hash_file.py test_numpy_001.py
[mythcat@desk Projects_Python]$ python test_hash_file.py
98b2833527ad3d9fe263542c6aa06c04182d3dfb
b222523567a8a806382b86578717ddbd00e0f4b4
[mythcat@desk Projects_Python]$ python test_hash_file.py
98b2833527ad3d9fe263542c6aa06c04182d3dfb
2134660551cc67812413a3a75fd12efb05d591ef
Sunday, August 9, 2020
Python 3.8.5 : Pearson Product Moment Correlation with corrcoef from numpy.
This method has a limitation in that it can compute the correlation matrix between two variables only.
The full name is the Pearson Product Moment Correlation (PPMC).
The PPMC is not able to tell the difference between dependent variables and independent variables.
The documentation about this function can be found here.
More examples of Pearson Correlation can be found on this website.
My example presented in this tutorial, use the random packet to randomly generate integers and then calculate the correlation coefficients.
All of these are calculated five times in a for a cycle and each time the seed parameters are changed randomly.
Each time the correlation matrices are printed and then the random number graphs are displayed.
Let's see the source code:
import random
import numpy as np
nr_integers = 100
size_integers = 100
import matplotlib
import matplotlib.pyplot as plt
# set from 0 to 4 seed for random and show result
for e in range(5):
# change random seed
np.random.seed(e)
# nr_integers random integers between 0 and size_integers
x = np.random.randint(0, size_integers, nr_integers)
# Positive Correlation with some noise created with
# nr_integers random integers between 0 and size_integers
positive_y = x + np.random.normal(0, size_integers, nr_integers)
correlation_positive = np.corrcoef(x, positive_y)
# show matrix for correlation_positive
print(correlation_positive)
# Negative Correlation with same noise created with
# nr_integers random integers between 0 and size_integers
negative_y = 100 - x + np.random.normal(0, size_integers, nr_integers)
correlation_negative = np.corrcoef(x, negative_y)
# show matrix for output with plt
print(correlation_negative)
# set graphic for plt with two graphics for each output with subplot
plt.subplot(1, 2, 1)
plt.scatter(x,positive_y)
plt.subplot(1, 2, 2)
plt.scatter(x,negative_y)
# show the graph
plt.show()
Wednesday, September 25, 2019
Python 3.7.4 : Print with random colors.
The script detect the platform for color settings and then use print.
The first print will print with blue color the name of the script.
I used random to select a random color from colors array and used to print the -=RANDOM COLOR=- text.
The print (W+'') is used to set default white color for terminal
import sys
import random
if sys.platform == "linux" or sys.platform == "linux2":
BB = "\033[34;1m" # Blue light
YY = "\033[33;1m" # Yellow light
GG = "\033[32;1m" # Green light
WW = "\033[0;1m" # White light
RR = "\033[31;1m" # Red light
CC = "\033[36;1m" # Cyan light
B = "\033[34m" # Blue
Y = "\033[33m" # Yellow
G = "\033[32m" # Green
W = "\033[0m" # White
R = "\033[31m" # Red
C = "\033[36m" # Cyan
colors = [BB,YY,GG,WW,RR,CC,B,Y,G,W,R,C]
print (B+"\033[2;2m "+sys.argv[0]+"\n"+B)
color=random.choice(colors)
print (color+"-=RANDOM COLOR=-"+color)
print (W+'')
For winodws platform you need to add this:elif sys.platform == "win32":
BB = '' # Blue light
YY = '' # Yellow light
GG = '' # Green light
WW = '' # White light
RR = '' # Red light
CC = '' # Cyan light
B = '' # Blue
Y = '' # Yellow
G = '' # Green
W = '' # White
R = '' # Red
C = '' # Cyan
P = '' # Random color
Wednesday, July 24, 2019
Python 3.7.3 : Testing the timeit and Bokeh python module.
- testing the timeit function to measure the execution time of a line of print code;
- using python lists to record data;
- generate lists using the range function;
- multiplying a number with an entire list of numbers;
- how to use the bokeh module with CustomJSHover and HoverTool
This module provides a simple way to time small bits of Python code. It has both a Command-Line Interface as well as a callable one. It avoids a number of common traps for measuring execution times.
C:\Python373>python.exe
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Inte
l)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> import random
>>> timeit.timeit('print("a")',number=1)
a
0.00013114200010022614
>>> timeit.timeit('print("a")',number=100)
...
a
0.007177434000027461
>>> timeit.timeit('print("a")',number=1000)
...
a
0.07585798000002342
Let make more visible the results with the bokeh python module:import timeit
import random
# if you want to use numpy
#import numpy as np
# import bokeh python module
from bokeh.plotting import figure, show, output_file
# for show values
from bokeh.models.tools import CustomJSHover
from bokeh.models import HoverTool
print ('''
You can tests a number of times named l
with a number of print named i
and see the result value with bokeh python module
timeit.timeit('print("a")',number = i)
''')
i = int(input('The increment number i:'))
l = int(input('The number of test l:'))
# create the list with the output values
timit_list = []
# create the test function for l and i and return the list
def get_timeit(i,l):
while i < l:
i += 1
out=timeit.timeit('print("a")',number = i)
timit_list.append(out)
return timit_list
# run the test function with l and i
# this will be coordinate y
yt=get_timeit(i,l)
# show result of the test
print(yt)
# create the coordinate x
xt = [i for i in range(0, len(yt))]
#xt = np.linspace(0, l, l)
# print the coordinate x
#print(xt)
# create the output HTML file to see the result
output_file("test.html")
# create a figure with a timeit type y-axis
fig = figure(title='timit_list values for print("a")',
plot_height=400, plot_width=700,
x_axis_label='x has each incrementation of i', y_axis_label='value of timeit of print the char a',
x_minor_ticks=3,
toolbar_location=None)
# create a circle for each value
# see new multiplication with a list
# y=[i * 100 for i in yt]
fig.circle(x=xt, y=[i * 100 for i in yt],
color='blue', size=5,
legend='Values')
x_custom = CustomJSHover(code="""
return '' + special_vars.data_x""")
y_custom = CustomJSHover(code="""
return '' + special_vars.data_y""")
fig.add_tools(
HoverTool(
show_arrow=True,
tooltips=[
('xt', '$data_x'),
('yt', '$data_y')
],
formatters=dict(
xt=x_custom,
yt=y_custom
)
)
)
# Put the legend in the upper left corner
fig.legend.location = 'top_left'
# Let's check it out
show(fig)
The result of this python source code can be found on my YouTube channel:Thursday, October 17, 2013
How to make a color gradient and images with python script.
The Image and ImageDraw provide simple 2D graphics to create new images, annotate or retouch existing images, and to generate graphics.
Also this can help you to make on the fly images for you.
Let's see one example ...
First you need to import this modules and random python module
import Image,ImageDraw
from random import randint as rint
The next step : make one image , get some random numbers...
You need two colors : first is one random color and second is make from first color, see next source code:
img = Image.new("RGB", (500,500), "#FFFFFF")
draw = ImageDraw.Draw(img)
r,g,b = rint(0,255), rint(0,255), rint(0,255)
dr = (rint(0,255) - r)/500.
dg = (rint(0,255) - g)/500.
db = (rint(0,255) - b)/500.
Now you need to draw lines with this gradient of two colors.
for i in range(500):
r,g,b = r+dr, g+dg, b+db
draw.line((i,0,i,500), fill=(int(r),int(g),int(b)))
... and the python script source code:
import Image,ImageDraw
from random import randint as rint
def random_gradient(name):
img = Image.new("RGB", (500,500), "#FFFFFF")
draw = ImageDraw.Draw(img)
r,g,b = rint(0,255), rint(0,255), rint(0,255)
dr = (rint(0,255) - r)/500.
dg = (rint(0,255) - g)/500.
db = (rint(0,255) - b)/500.
for i in range(500):
r,g,b = r+dr, g+dg, b+db
draw.line((i,0,i,500), fill=(int(r),int(g),int(b)))
img.save(name+".png", "PNG")
if __name__ == "__main__":
for name in range(10):
random_gradient(str(name))
The result of this script will make images :
Thursday, June 13, 2013
What you need : stdout or print ?
My question is much more complicated than intended and I will show you in this tutorial.
Most users use print or print() - if it used in python 3.
For example you can use this without import any python module.
$ python
Python 2.6.8 (unknown, Apr 14 2013, 18:10:41)
[GCC 4.3.2 20081105 (Red Hat 4.3.2-7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "my text"
my text
>>>
This is simple to show some strings.
What the most people don't know about print function it's the interface of stdout.write.
Let's see another example with stdout.write .
>>> sys.stdout.write(str(my text) + '\n')
File "", line 1
sys.stdout.write(str(my text) + '\n')
^
SyntaxError: invalid syntax
>>> sys.stdout.write(str("my text") + '\n')
Traceback (most recent call last):
File "", line 1, in
NameError: name 'sys' is not defined
First error tells us about function str.It's need just one arg not this my text.
The next error tells us about sys module is not import by python.
Note: This restriction can help us sometime.
Some example using stdout.write :
First is : my text example , see I add '\n' to go to the next row.
>>> import sys
>>> sys.stdout.write("my text"+'\n')
my text
Let's try to change the output.
See the next image :
You can say : I can do this with print function.
>>> print "\033[0;32m"+"my text"+"\033[0m"
my text
Yes! Right. Can you do this ? (see the next video)
Monday, February 25, 2013
Make Newton fractal with python
A fractal is a mathematical set that has a fractal dimension that usually exceeds its topological dimension , see Fractal wikipedia.
Today I used my mind and also my python skills to make one fractal image.
I use Newton's method to make all points and PIL python module to save the result.
Let's see the source code and comments.
from PIL import Image
#size of image
imgx = 600
imgy = 400
#make image buffer
image = Image.new("RGB", (imgx, imgy))
# area of fractal
xa = -2.0
xb = 2.0
ya = -2.0
yb = 2.0
#define constants
max_iterations = 10 # max iterations allowed
step_derivat = 0.002e-1 # step size for numerical derivative
error = 5e-19 # max error allowed
# function will generate the newton fractal
def f(z): return z * z + complex(-0.31,0.031)
# draw derivate fractal for each y and x
for y in range(imgy):
zy = y * (yb - ya)/(imgy - 1) + ya
for x in range(imgx):
zx = x * (xb - xa)/(imgx - 1) + xa
z = complex(zx, zy)
for i in range(max_iterations):
# make complex numerical derivative
dz = (f(z + complex(step_derivat, step_derivat)) - f(z))/complex(step_derivat,step_derivat)
# Newton iteration see wikipedia
z0 = z - f(z)/dz
# stop to the error
if abs(z0 - z) < error:
break
z = z0
#I use modulo operation expression to do RGB colors of the pixels
image.putpixel((x, y), (i % 8 * 16, i % 4 * 32,i % 2 * 64))
#save the result
image.save("fractal.png", "PNG")
This is the final result of Newton fractal image:
Thursday, September 13, 2012
Simple python script - Voronoi diagram
Today I show you how to make Voronoi diagram using python.
I use this to make textures for underwater.
This is just one example. But you can improve to control all cells of voronoi diagram.
The theory say:
In mathematics, a Voronoi diagram is a special kind of decomposition of a metric space, determined by distances to a specified family of objects (subsets) in the space. These objects are usually called the sites or the generators...Source : wikipedia.
I used the euclidean distance to make the Voronoi diagram because it's the most familiar case.
About wikipedia - Euclidean_distance: In mathematics, the Euclidean distance or Euclidean metric is the "ordinary" distance between two points that one would measure with a ruler, and is given by the Pythagorean formula...
My python script use the next python modules:
PIL - this allow me to use image functions.
random - this module give me... random numbers.
math - some math functions.
Let's see the source code :
from PIL import Image
import random
import math
Now I make the function named gen_voronoi.
This take the height and width of the output image and the number of cells.
The function has some random variables for red , green , blue - nr,ng,nb.
The function hypot is not accessible directly so we need to import math module and using math static object.
The return value is the Euclidean norm : sqrt(x*x + y*y).
def gen_voronoi(w, h, cells):
image = Image.new("RGB", (w, h))
putpixel = image.putpixel
img_x, img_y = image.size
nx = []
ny = []
nr = []
ng = []
nb = []
for i in range(cells):
nx.append(random.randrange(img_x))
ny.append(random.randrange(img_y))
nr.append(random.randrange(256))
ng.append(random.randrange(256))
nb.append(random.randrange(256))
for y in range(img_y):
for x in range(img_x):
dmin = math.hypot(img_x-1, img_y-1)
j = -1
for i in range(cells):
d = math.hypot(nx[i]-x, ny[i]-y)
if d < dmin:
dmin = d
j = i
putpixel((x, y), (nr[j], ng[j], nb[j]))
image.save("output.png", "PNG")
image.show()
Use the function to make the output.png image.
gen_voronoi(200, 200, 55)
The result is :
Tuesday, August 3, 2010
Random module - another example
Even if it is not used in the final software, he helps us to test various types of random data.
We present you a simple example - play with cards.
We chose a list of cards of one color for not having a large number of elements.
We exemplify the use of random module by analogy with a game of cards.
That it means: shuffle cards , select just one from cards and a choice selection of a defined number of cards.
Below you see the code used as an example.
>>> import random
>>> choice=random.choice
>>> shuffle=random.shuffle
>>> for i in range (9):
... print choice(cards)
...
Q
K
10
Q
2
2
10
K
6
>>> shuffle(cards)
>>> cards
[4, 7, 10, 'J', 3, 'Q', 6, 2, 'K', 9, 'A', 8, 5]
>>> sample=random.sample
>>> sample(cards,5)
[8, 'J', 2, 'Q', 10]
>>> sample(cards,5)
['A', 9, 4, 'K', 'Q']
>>>
The random module docsWednesday, October 21, 2009
MD5 - password generator
Internet is full of generating MD5.
The Internet has and dictionaries for decrypting md5.
So safe is our script.
You must use the code line:
p = md5.new ()
otherwise if you use:
pass = md5.new ()
you get the following error:
>>> pass = md5.new() File "", line 1 pass = md5.new() ^ SyntaxError: invalid syntax
pass is a python keyword.
You'll need a different name for the variable.
And now to see the code:
import md5 p = md5.new() p.update("password") p.hexdigest() '5f4dcc3b5aa765d61d8327deb882cf99'
This is all you need.