10

Bir resmi belirli bir genişliğe ve yüksekliğe yeniden boyutlandırıp kırpmam gerekiyor. Kare bir minik resim oluşturacak bir yöntem yapabildim, ancak istenen küçük resim karesi olmadığında bunu nasıl uygulayacağımı bilmiyorum.App Engine Belirli Bir Genişlik ve Yüksekliğe Kırpma

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 

Bunu yapmanın daha iyi bir yolu varsa lütfen bize bildirin. Herhangi bir yardım büyük takdir edilecektir.

İstenen işlemi açıklayan bir diyagram. crop_diagram

sayesinde

Kyle

cevap

17

Benzer bir sorun yaşadım (ekran görüntüsü çok kullanışlıdır). Benim çözümüm:

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() 
+0

Teşekkür ederiz. Tam olarak aradığım şey bu. –

+0

kod için çok teşekkürler, harika çalışıyor! – goggin13

+0

thx! tam olarak ne aradığımı – fceruti

2

Sen resize hem heightvewidth parametreleri belirtebilirsiniz - bu boy oranı değişmeyecek (yapamayacağı bununla GAE'nin en images modülü), ancak İki boyutun her birinin, belirttiğiniz karşılık gelen değer olan <= olmasını sağlayacaktır (aslında, belirttiğiniz değere tam olarak eşit olacaktır, diğeri <= olacaktır).

Neden ilk önce kırptığınızı ve daha sonra yeniden boyutlandıracağınızdan emin değilim - sanki başka bir şeyleri tersine yapmalısınız ... yeniden boyutlandırın, böylece orijinal görüntünün "uygun" olduğu kadar Daha sonra kesin boyut sağlamak için kırpın. (Bu nedenle, yeniden boyutlandırma için yükseklik ve genişlikteki orijinal değerleri kullanmazsınız. Böylece, gereksinimlerinizi doğru bir şekilde anlarsam, ortaya çıkan görüntünün hiçbiri "boş" veya "boş" olmaz. Belki de tam olarak neye ihtiyaç duyduğunuzu anlayamıyorum - bir örnek verebilir misiniz (işlemden önce göründüğü gibi bir görüntünün URL'leri, işlemden sonra nasıl görünmesi gerektiği ve geçireceğiniz parametrelerin detayları) ?

+0

Teşekkür ederim Alex, Örneğin, 500px'lik bir genişliğe ve 300px'lik bir yüksekliğe sahip bir görüntü var. Kırpılmış görüntü (küçük resim) 150px genişliğe ve 100 piksel yüksekliğe sahip olmak isterim. İlk önce yeniden boyutlandırma hakkına inanıyorum. Eminim tüm işlevin oldukça basit bir şekilde kodla uğraşıyorum. İşte süreci açıklayan bir diyagramın bir bağlantısı. http://farm3.static.flickr.com/2543/4205690696_b3821a12e9_o.gif –