From the demo image (dimension: 976×538, aspect ratio = 976/538 = 1.81):

python3 img2img.py --num_cols 100 --language general --mode complex --background white --output data/output.png gives:

which is a picture of dimension 1200×515 (aspect ratio = 1200/515 = 2.33, which is very different from 1.81).
The reason is this line of code: cell_height = scale * cell_width (in line 36 of img2img.py).
The factor cell_height / cell_width needs to be the same as the factor char_height / char_width, so the previous code becomes:
cell_height = (char_height / char_width) * cell_width.
Moreover, the line char_width, char_height = font.getsize(sample_character) generate a warning:
DeprecationWarning: getsize is deprecated and will be removed in Pillow 10 (2023-07-01). Use getbbox or getlength instead.
So on utils.py, all lines similar to char_width, char_height = font.getsize("◊") (with various values for ◊) needs to be replaced by:
char_bbox = font.getbbox("◊")
char_width = char_bbox[2] - char_bbox[0]
char_height = char_bbox[3]
(caution: there is no missing char_bbox[1] in the previous code. And strangely "bottom" really gives the height. See this: python-pillow/Pillow#7802).
This correction must also be made in line 44 of img2img.py: remplace char_width, char_height = font.getsize(sample_character) with
char_bbox = font.getbbox(sample_character)
char_width = char_bbox[2] - char_bbox[0]
char_height = char_bbox[3]
So, by rearranging order of some calculus (because the calculus of cell_height needs to known the value of char_height / char_width), I suggest this correction in the code of img2img.py (extract of the code for the main function):
def main(opt):
if opt.background == "white":
bg_code = 255
else:
bg_code = 0
char_list, font, sample_character, scale = get_data(opt.language, opt.mode)
num_chars = len(char_list)
num_cols = opt.num_cols
image = cv2.imread(opt.input)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
height, width = image.shape
char_bbox = font.getbbox(sample_character)
char_width = char_bbox[2] - char_bbox[0]
char_height = char_bbox[3]
cell_width = width / opt.num_cols
#cell_height = scale * cell_width
cell_height = (char_height/char_width) * cell_width
num_rows = int(height / cell_height)
if num_cols > width or num_rows > height:
print("Too many columns or rows. Use default setting")
cell_width = 6
#cell_height = 12
cell_height = (char_height/char_width) * cell_width
num_cols = int(width / cell_width)
num_rows = int(height / cell_height)
#char_width, char_height = font.getsize(sample_character)
out_width = char_width * num_cols
out_height = scale * char_height * num_rows
out_image = Image.new("L", (out_width, out_height), bg_code)
draw = ImageDraw.Draw(out_image)
For comparison, the old code for the same portion was:
def main(opt):
if opt.background == "white":
bg_code = 255
else:
bg_code = 0
char_list, font, sample_character, scale = get_data(opt.language, opt.mode)
num_chars = len(char_list)
num_cols = opt.num_cols
image = cv2.imread(opt.input)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
height, width = image.shape
cell_width = width / opt.num_cols
cell_height = scale * cell_width
num_rows = int(height / cell_height)
if num_cols > width or num_rows > height:
print("Too many columns or rows. Use default setting")
cell_width = 6
cell_height = 12
num_cols = int(width / cell_width)
num_rows = int(height / cell_height)
char_width, char_height = font.getsize(sample_character)
out_width = char_width * num_cols
out_height = scale * char_height * num_rows
out_image = Image.new("L", (out_width, out_height), bg_code)
draw = ImageDraw.Draw(out_image)
So, with the modified code, python3 img2img.py --num_cols 100 --language general --mode complex --background white --output data/NewOutput.png gives:

The dimension of this corrected image is 1200×648, and it's aspect ratio is 1200/648=1.85, which is near the 1.81 aspect ratio of the original image.
I will show a more visible difference, by scaling the outputted image, so it's width is the same as the inputed image, and displaying it in a graphic manipulation software, with a transparent backgroung over the inputed image:
Before the correction:
After the correction:

From the demo image (dimension: 976×538, aspect ratio = 976/538 = 1.81):
python3 img2img.py --num_cols 100 --language general --mode complex --background white --output data/output.pnggives:which is a picture of dimension 1200×515 (aspect ratio = 1200/515 = 2.33, which is very different from 1.81).
The reason is this line of code:
cell_height = scale * cell_width(in line 36 ofimg2img.py).The factor
cell_height / cell_widthneeds to be the same as the factorchar_height / char_width, so the previous code becomes:cell_height = (char_height / char_width) * cell_width.Moreover, the line
char_width, char_height = font.getsize(sample_character)generate a warning:DeprecationWarning: getsize is deprecated and will be removed in Pillow 10 (2023-07-01). Use getbbox or getlength instead.So on
utils.py, all lines similar tochar_width, char_height = font.getsize("◊")(with various values for ◊) needs to be replaced by:(caution: there is no missing
char_bbox[1]in the previous code. And strangely "bottom" really gives the height. See this: python-pillow/Pillow#7802).This correction must also be made in line 44 of
img2img.py: remplacechar_width, char_height = font.getsize(sample_character)withSo, by rearranging order of some calculus (because the calculus of
cell_heightneeds to known the value ofchar_height / char_width), I suggest this correction in the code ofimg2img.py(extract of the code for themainfunction):For comparison, the old code for the same portion was:
So, with the modified code,
python3 img2img.py --num_cols 100 --language general --mode complex --background white --output data/NewOutput.pnggives:The dimension of this corrected image is 1200×648, and it's aspect ratio is 1200/648=1.85, which is near the 1.81 aspect ratio of the original image.
I will show a more visible difference, by scaling the outputted image, so it's width is the same as the inputed image, and displaying it in a graphic manipulation software, with a transparent backgroung over the inputed image:
Before the correction:
After the correction: