<фото про буханку хлеба и троллейбус.png>
Хорошо, что вы не каждую секунду обновляетесь, а то пришлось бы вам отдельно указывать, на каких файловых системах можно это запускать.
(Подсказка: не влезло бы в fat32, были бы проблемы у ext2/3, про ntfs не помню).
Иными словами, почему бы не создавать изображение на лету? И да, статья о том, как получить id пользовательской сессии в телеграмме only.
Первый пришедший в голову пример — логи, прекрасно пишутся и читаются чаще, чем раз в секунду на всех этих фс.
Создавать изображения на лету — идея неплохая, но их все равно пришлось бы сохранять как файл, чтобы потом передать в метод TelegramClient.upload_file, именно поэтому решил сделать специальную папку с фотографиями. Вероятнее всего, должен быть метод, который принимает массив байтов вместо названия файла для размещения медиа, однако я писал все это больше ради забавы, посему об оптимизации особо не задумывался.
Почти наверняка upload_file умеет работать с потоком байтов в памяти Пайтона. Очень многие функции позволяют работать с BytesIO напрямую или через минимальную конвертацию данных
- Можно сделать раздел в RAMFS.
- Можно сделать в обычной файловой системе пайп, куда питоновский скрипт будет выводить байты картинки.
- Можно, наверно, не имя файла передавать, а открытый и доступный для чтения поток, следовательно можно было обойтись потоком `io.BytesIO`.
- А ещё нет никакого смысла хранить тысячи файлов, если рендер на лету такой картинки сопоставим по времени с загрузкой её с диска.
- Можно даже сделать виртуальную файловую систему, которая на запрос открытия любого файла будет генерить на лету и возвращать картинку с нарисованным именем этого файла и в запрошенном формате.
О сколько странных извращений даёт нам Python совершать.
Но это реально уже мелочи :)
- 00...23
- Статическую ":"
- 00...59
После чего склеивать их в:
hours[hour] + colon + minutes[minute]
И накладывать на базовое изображение.
Тогда картинок в кеше понадобится только 24 + 60 + 1 = 85
Часы могут иметь другой шрифт, другой формат (например бразильский 6h 45min etc.).
А не проще взять моноширинный шрифт и использовать "0".."9" и ":" — 11 картинок?
Почему бы для этих целей не заливать файлы в Сохранённые сообщения и сохранять id файлов в конфиг файле или БД?

github.com/plaksivayatryapka/telegram_avatar/blob/master/change_avatar.py
Подскажите, а это можно сделать только на аву юзера или можно сделать на канал и сообщество?
нижний пробел
нижнее подчеркивание.
(простите, не удержался от маленького замечания)
generate_image_with_text(text)
Правильно
def generate_image_with_text(text):
image = get_black_background()
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image, text, (int(image.shape[0]*0.35), int(image.shape[1]*0.5)), font, 1.5, (255, 255, 0), 2, cv2.LINE_AA)
return image
хорошо, с библиотеками разобрались, выдает такую ошибку:
ModuleNotFoundError: No module named 'main.utils'; 'main' is not a package
Python 3.7.3
установлены 3 библиотеки: telthon, opencv, utils
можно же как то сделать типа такого:
utils.py:
def convert_time_to_string(dt):
return f"{dt.hour}:{dt.minute:02}"
def time_has_changed(prev_time):
return convert_time_to_string(datetime.now()) != prev_time
generate_time_images.py:
from .utils import import cv2
import numpy as np
from datetime import datetime, timedelta
def get_black_background():
return np.zeros(500, 500)
start_time = datetime.strptime("2019-01-01", "%Y-%m-%d") # Можете выбрать любую дату
end_time = start_time + timedelta(days=1)
def generate_image_with_text(text):
image = get_black_background()
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image, text, (int(image.shape[0]0.35), int(image.shape[1]*0.5)), font, 1.5, (255, 255, 0), 2, cv2.LINE_AA)
return image
while start_time < end_time:
text = convert_time_to_string(start_time)
image = generate_image_with_text(text)
cv2.imwrite(f"time_images/{text}.jpg", image)
start_time += timedelta(minutes=1)
и так все 3 файла чтобы не собирать по всему посту )
меня вот это смущает from .utils import * а именно звездочка, что она означает?
File «C:/Users/Public/Downloads/clock/generate_time_images.py», line 1, in from .utils import *
ModuleNotFoundError: No module named '__main__.utils'; '__main__' is not a package
Process finished with exit code 1
Traceback (most recent call last):
File «C:/Users/Public/Downloads/clock/generate_time_images.py», line 21, in image = generate_image_with_text(text)
File «C:/Users/Public/Downloads/clock/generate_time_images.py», line 14, in generate_image_with_text
image = get_black_background()
File «C:/Users/Public/Downloads/clock/generate_time_images.py», line 11, in get_black_background
return np.zeros(500, 500)
TypeError: data type not understood
Process finished with exit code 1
В этой строке «return np.zeros((500, 500))» нужны двойные скобки во всех файлах.
ковыряю дальше ))
Это (255, 255, 0) не RGB я так понял? Потому что изменения дают мне лишь оттенки серого
В инете написано нужен кортеж для RGB и просто скалярные значения для серого. Попытался даже явно указать tuple((155, 100, 255)) и все равно получил только серые тона
Точнее нашел немного обходной путь.
Посколько мы создаем черный фон вручную, то он получается в градациях серого. Поэтому и текст можно наносить только в черно-белых тонах. Как тут указать, что созданный фон в цветной шкале я не понял.
Поэтому чтобы этого избежать я просто сам нарисовал черный фон и загрузил его указав в параметре, что это цветное изображение
image = cv2.imread('Black_background.jpg', 1)
Все заработало, в этом и была проблема.
github.com/aforizm/avatar-change-time
Traceback (most recent call last):
File «main.py», line 18, in client(DeletePhotosRequest(client.get_profile_photos('me')))
AttributeError: 'TelegramClient' object has no attribute 'get_profile_photos'
походу телетон надо обновить )
Как превратить свою аватарку в Telegram в часы