Получение изображения и обрезка перед сохранением django
Я использую django. У меня есть код, который анализирует HTML код и пытается получить и сохранить изображение в базе данных. Вот код:
link = content[content.find(
'src=')+5:content.find('alt')-2]
img_data = requests.get(link).content
with open('temp_image.jpg', 'wb') as handler:
handler.write(img_data)
with open('temp_image.jpg', 'rb') as handler:
file_name = link.split("/")[-1]
post.cover.save(file_name, files.File(handler))
os.remove("temp_image.jpg")
Но мне также нужно обрезать изображение. Как я могу это сделать? Спасибо.
Добавьте метод сохранения к вашей базе данных в models.py. Ниже я добавил пример, который обрезает изображение и сохраняет обрезанный файл. Этот пример обрезает изображение, но сохраняет соотношение сторон, где короткая сторона составляет 200 пикселей. Измените desired_height, если вам нужно больше или меньше.
Используя библиотеку Pillow, вы можете выполнять все виды обработки изображений методом сохранения вашей модели, включая сложное кадрирование. Pillow - это золотой стандарт для обработки изображений в Python.
pip install Pillow
Подробнее об API Pillow можно прочитать в документации.
Пример работы:
Ниже приведен рабочий пример переопределенного метода сохранения модели Django, который вырезает самый большой центральный квадрат из изображения, независимо от размеров, а затем изменяет размер этого квадрата до 200 x 200 пикселей.
Я написал это как простой способ обработки фотографий логотипа или профиля, где изображение или лицо находится в центре изображения. При обрезке важно учитывать различные сценарии, возникающие, когда ваш входной файл портретный или альбомный, или квадратный, поэтому я и включил этот пример. Безразличное отношение к каждому из них может привести к нежелательному разрешению некоторых изображений.
Дополнительный забавный факт:
Если вам интересно, как работает метод Пиллоу Image.ANTIALIAS или Image.LANCZOS, ознакомьтесь с увлекательным алгоритмом Ланцоша , который используется для понижения дискретизации изображений при изменении размера, но сохранения их визуальной информации.