Объект изображения, возвращаемый PicturePlaceholder.insert_picture
, имеет ту же позицию и размер, что и заполнитель, из которого он получен.Он обрезается, чтобы полностью заполнить это пространство.Либо верхняя и нижняя части обрезаются, либо левая и правая стороны, в зависимости от соотношения сторон заполнителя и вставляемого изображения.Это то же самое поведение, которое демонстрирует PowerPoint при вставке изображения в заполнитель изображения.
Если вы хотите удалить обрезку, просто установите для всех значений обрезки значение 0:
picture = placeholder.insert_picture(...)
picture.crop_top = 0
picture.crop_left = 0
picture.crop_bottom = 0
picture.crop_right = 0
Это будетне меняйте положение (в верхнем левом углу), но почти всегда изменяйте размер, делая его шире или выше (но не оба).
Таким образом, это решает первую проблему легко, но, конечно, представляету вас есть второй, который заключается в том, как расположить изображение там, где вы хотите, и как правильно масштабировать его, не меняя соотношения сторон (растягивая или сжимая его).
Это во многом зависит от того, что вы 'Вы пытаетесь достичь и какой результат вы находите наиболее приятным.Вот почему это не автоматически;просто невозможно предсказать.
Вы можете найти "родную" ширину и высоту изображения следующим образом:
width, height = picture.image.size # ---width and height are int pixel-counts
Оттуда вам нужно будет сравнить пропорцииисходный заполнитель и вставленное изображение, а также настройте ширину или высоту формы изображения.
Допустим, вы хотели сохранить ту же позицию, но сохранить ширину и высоту заполнителя в качестве соответствующих максимумов, так чтобы всекартинка помещается в пространство, но имеет «поле» внизу или справа:
available_width = picture.width
available_height = picture.height
image_width, image_height = picture.image.size
placeholder_aspect_ratio = float(available_width) / float(available_height)
image_aspect_ratio = float(image_width) / float(image_height)
picture.crop_top = 0
picture.crop_left = 0
picture.crop_bottom = 0
picture.crop_right = 0
# ---if the placeholder is "wider" in aspect, shrink the picture width while
# ---maintaining the image aspect ratio
if placeholder_aspect_ratio > image_aspect_ratio:
picture.width = int(image_aspect_ratio * available_height)
# ---otherwise shrink the height
else:
picture.height = int(available_width/image_aspect_ratio)
Это может быть разработано для «центрирования» изображения в исходном пространстве и, возможно, для использования «негативной обрезки»чтобы сохранить исходный размер заполнителя.
Я не проверял это, и вам может потребоваться внести некоторые изменения, но, надеюсь, это даст вам представление о том, как действовать дальше.Это было бы хорошо для извлечения в свою собственную функцию, например adjust_picture_to_fit(picture)
.