DevGang
Авторизоваться

Создайте свой собственный инструмент для наклеек/рамок для фотографий профиля

В большей части Интернета наша личность сведена к маленькой фотографии профиля и отображаемому имени, и это миниатюрный холст, на котором мы можем выразить свою индивидуальность или сделать заявление. Мы регистрируем наш профиль, чтобы принять участие в общественном движении, представлять организацию или бренд или просто объявить, что мы «открыты для работы».

Интересно, как создать один из этих генераторов изображений, чтобы люди могли оживить свои фотографии в профиле? Вот простая версия на Python, которое использует частично прозрачное наложение изображения для пользовательской рамки и наклеек.

При этом берется фотография профиля пользователя (из Twitter), сверху добавляется наложенное изображение, а затем вы можете использовать полученное изображение в качестве URL-адреса данных для отображения в HTML или записать его как (временный) файл (который также можно передать обратно в Twitter для обновления фотографии профиля пользователя). Недавно была создана функция как забавный маленький проект для Block Party.

Во-первых, давайте извлечем фотографию профиля пользователя из Twitter. Мы исходили от статьи о клиенте Twitter (извините), но вы можете использовать что-то вроде Tweepi.

from PIL import Image 
import requests 

PFP_IMAGE_SIZE = (400, 400)  # max/standard size on Twitter

def get_original_pfp_image(twitter_screen_name):
    # TODO(you) Implement this
    client = create_twitter_client_for_app()  

    twitter_user_json = client.get_twitter_user_data_by_screen_name(
        twitter_screen_name)
    pfp_url = twitter_user_json.get("profile_image_url_https", "")
    pfp_original_url = pfp_url.replace("_normal", "")   

    pfp_image = Image.open(
        requests.get(pfp_original_url, stream=True).raw)

    # We aren't guaranteed that the user's profile image is 
    # the right size, which will cause issues when trying to 
    # apply the overlay. 
    if pfp_image.size != PFP_IMAGE_SIZE:  
        pfp_image = pfp_image.resize(
            PFP_IMAGE_SIZE, Image.ANTIALIAS)

    return pfp_image

Если вы хотите упростить разработку и тестирование, вы можете вместо этого указать локальный путь к изображению.

from PIL import Image 

PFP_IMAGE_SIZE = (400, 400)  

# Note that this has a slightly different function signature 
# than the alternative sample code. 
def get_original_pfp_image(pfp_image_path):
    pfp_image = Image.open(pfp_image_path)

    if pfp_image.size != PFP_IMAGE_SIZE:  
        pfp_image = pfp_image.resize(
            PFP_IMAGE_SIZE, Image.ANTIALIAS)

    return pfp_image

Далее давайте загрузим наложенное изображение, скомпоноваем его с исходной фотографией профиля и создадим новое наложенное изображение.

Наложенное изображение здесь должно соответствовать размерам 400x400 PNG с прозрачностью.

import PIL
from PIL import Image

def get_overlay_image(overlay_image_path):
    overlay_image = Image.open(overlay_image_path)
    return overlay_image

def generate_overlaid_image(twitter_screen_name):
    pfp_image = get_original_pfp_image(twitter_screen_name)
    if not pfp_image:
        return None

    # We need RGBA mode for transparency in the image
    pfp_image_rgba = pfp_image.convert(mode="RGBA")  

    # TODO(you) Replace with your overlay image path
    overlay_image = get_overlay_image("overlay.png")
    overlaid_pfp_image = PIL.Image.alpha_composite(
        pfp_image_rgba, overlay_image)
    return overlaid_pfp_image

Теперь давайте получим изображение в виде URL-адреса данных, чтобы мы могли отобразить его в HTML.

import base64
from io import BytesIO

DATA_IMAGE_PREFIX = "data:image/png;base64,"

def generate_overlaid_pfp_image_data_url(twitter_screen_name):
    overlaid_pfp_image = generate_overlaid_pfp_image(
        twitter_screen_name)
    if not overlaid_pfp_image:
        return None

    image_io = BytesIO()
    overlaid_pfp_image.save(image_io, "png", quality=95)
    data_url = DATA_IMAGE_PREFIX + base64.b64encode(
        image_io.getvalue()).decode("ascii")
    return data_url

Для предварительного просмотра в Jinja - например, во всех различных размерах, которые использует Twitter - мы просто используем этот URL-адрес данных изображения в качестве src элемента img.

{% for dims in [(24, 24), (48, 48), (73, 73), (400, 400)] %}
    <img src="{{ image_data_url }}" 
         width="{{ dims[0] }}" 
         height="{{ dims[1] }}" />
{% endfor %}

Наконец, если вы действительно хотите вернуть фотографию профиля пользователя в Twitter, вы можете создать временный файл и отправить его через API.

import base64
from io import BytesIO

DATA_IMAGE_PREFIX = "data:image/png;base64,"

def update_user_twitter_pfp(twitter_user_id, image_data_url):
    image_data = image_data_url[len(DATA_IMAGE_PREFIX):]

    buffer = BytesIO(base64.b64decode(image_data))
    image_tempfile = tempfile.NamedTemporaryFile(suffix=".png")

    try:
        image_tempfile.write(buffer.read())
        image_tempfile.flush()

        # This client is created with the user's OAuth 
        # credentials (vs. app credentials) so we can 
        # set their profile photo. 
        client = create_twitter_client_for_user(
            twitter_user_id)
        client.update_twitter_user_profile_image(
            image_tempfile.name)
    finally:
        buffer.close()
        image_tempfile.close()

Вот так будет выглядеть наш результат.

#Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу