Используемый thumbnail
метод изменения размера по умолчанию - NEAREST, что является действительно плохим выбором. Например, если вы измените размер до 1/5 от исходного размера, он выведет один пиксель, а затем выкинет следующие 4 - у линии шириной в один пиксель есть только 1 из 5 шансов показать на всех в результате!
Удивительно, что BILINEAR и BICUBIC не намного лучше. Они берут формулу и применяют ее к 2 или 3 ближайшим пикселям к исходной точке, но по-прежнему остается много пикселей, на которые они не смотрят, и формула в любом случае ослабит линию.
Наилучшим выбором является ANTIALIAS, который, по-видимому, учитывает все исходное изображение, не выбрасывая пиксели. Линии станут тусклыми, но не исчезнут полностью; при необходимости вы можете сделать дополнительный шаг, чтобы улучшить контраст.
Обратите внимание, что все эти методы будут возвращаться к БЛИЖАЙШЕМУ, если вы работаете с изображением в палитре, т.е. im.mode == 'P'
. Вы всегда должны конвертировать в 'RGB'.
from PIL import Image
im = Image.open(fn)
im = im.convert('RGB')
im.thumbnail(size, Image.ANTIALIAS)
Вот пример, взятый с сайта electronics.stackexchange https://electronics.stackexchange.com/questions/5412/easiest-and-best-poe-ethernet-chip-micro-design-for-diy-interface-with-custom-ard/5418#5418
Использование алгоритма NEAREST по умолчанию, который, как я полагаю, аналогичен вашим результатам:
![NEAREST](https://i.stack.imgur.com/mcmmd.png)
Использование алгоритма ANTIALIAS:
![ANTIALIAS](https://i.stack.imgur.com/zgYAx.png)