محرك التطبيق المحصور إلى عرض محدد وارتفاع
سؤال
أحتاج إلى تغيير حجم صورة وارتفاعها وارتفاعها. تمكنت من إنشاء طريقة من شأنها إنشاء صورة مصغرة مربعة ، لكنني غير متأكد من كيفية تطبيق هذا ، عندما لا تكون الصورة المصغرة المطلوبة مربعة.
def rescale(data, width, height):
"""Rescale the given image, optionally cropping it to make sure the result image has the specified width and height."""
from google.appengine.api import images
new_width = width
new_height = height
img = images.Image(data)
org_width, org_height = img.width, img.height
# We must determine if the image is portrait or landscape
# Landscape
if org_width > org_height:
# With the Landscape image we want the crop to be centered. We must find the
# height to width ratio of the image and Convert the denominater to a float
# so that ratio will be a decemal point. The ratio is the percentage of the image
# that will remain.
ratio = org_height / float(org_width)
# To find the percentage of the image that will be removed we subtract the ratio
# from 1 By dividing this number by 2 we find the percentage that should be
# removed from each side this is also our left_x coordinate
left_x = (1- ratio) / 2
# By subtract the left_x from 1 we find the right_x coordinate
right_x = 1 - left_x
# crop(image_data, left_x, top_y, right_x, bottom_y), output_encoding=images.PNG)
img.crop(left_x, 0.0, right_x, 1.0)
# resize(image_data, width=0, height=0, output_encoding=images.PNG)
img.resize(height=height)
# Portrait
elif org_width < org_height:
ratio = org_width / float(org_height)
# crop(image_data, left_x, top_y, right_x, bottom_y), output_encoding=images.PNG)
img.crop(0.0, 0.0, 1.0, ratio)
# resize(image_data, width=0, height=0, output_encoding=images.PNG)
img.resize(width=witdh)
thumbnail = img.execute_transforms()
return thumbnail
إذا كانت هناك طريقة أفضل للقيام بذلك ، فيرجى إخبارنا بذلك. أي مساعدة سيكون موضع تقدير كبير.
إليك رسم تخطيطي يشرح العملية المطلوبة.
شكرًا،
كايل
المحلول
واجهت مشكلة مماثلة (كانت لقطة الشاشة الخاصة بك مفيدة للغاية). هذا هو الحل:
def rescale(img_data, width, height, halign='middle', valign='middle'):
"""Resize then optionally crop a given image.
Attributes:
img_data: The image data
width: The desired width
height: The desired height
halign: Acts like photoshop's 'Canvas Size' function, horizontally
aligning the crop to left, middle or right
valign: Verticallly aligns the crop to top, middle or bottom
"""
image = images.Image(img_data)
desired_wh_ratio = float(width) / float(height)
wh_ratio = float(image.width) / float(image.height)
if desired_wh_ratio > wh_ratio:
# resize to width, then crop to height
image.resize(width=width)
image.execute_transforms()
trim_y = (float(image.height - height) / 2) / image.height
if valign == 'top':
image.crop(0.0, 0.0, 1.0, 1 - (2 * trim_y))
elif valign == 'bottom':
image.crop(0.0, (2 * trim_y), 1.0, 1.0)
else:
image.crop(0.0, trim_y, 1.0, 1 - trim_y)
else:
# resize to height, then crop to width
image.resize(height=height)
image.execute_transforms()
trim_x = (float(image.width - width) / 2) / image.width
if halign == 'left':
image.crop(0.0, 0.0, 1 - (2 * trim_x), 1.0)
elif halign == 'right':
image.crop((2 * trim_x), 0.0, 1.0, 1.0)
else:
image.crop(trim_x, 0.0, 1 - trim_x, 1.0)
return image.execute_transforms()
نصائح أخرى
يمكنك تحديد كليهما height
و width
المعلمات ل resize
- لن يغير نسبة العرض إلى الارتفاع (لا يمكنك فعل ذلك باستخدام GAE images
الوحدة النمطية) ، لكنها ستضمن أن كل من الأبعاد <=
القيمة المقابلة التي تحددها (في الواقع ، ستكون واحدة مساوية تمامًا للقيمة التي تحددها ، والآخر سيكون <=
).
لست متأكدًا من سبب اقتصاصك أولاً وتغيير حجمه لاحقًا - يبدو أنك يجب أن تفعل الأشياء في الاتجاه الآخر ... تغيير حجمها بحيث تكون أكبر عدد من الصورة الأصلية "تناسب" ، ثم المحاصيل لضمان البعد الناتج الدقيق. (لذلك لن تستخدم القيم الأصلية المقدمة من الارتفاع والعرض لتغيير الحجم - يمكنك زيادة حجمها بحيث لا يتم إهدار أي من الصورة الناتجة "AKA" AKA "Blank" ، إذا فهمت متطلباتك بشكل صحيح). لذلك ربما لا أفهم بالضبط ما تحتاجه - هل يمكنك تقديم مثال (عناوين URL على صورة كما تبدو قبل المعالجة ، وكيف يجب أن تعتني بالمعالجة ، وتفاصيل المعلمات التي تمر بها) ؟