Особенность конвертера - не нужно выбирать долбанные файлы .webp вручную - достаточно открыть .py скрипт рядом с ними.
Mikl___, python повел меня по такому пути (WIC фабрики): Код (Python): import ctypes import ctypes.wintypes import pythoncom from win32com import universal from win32com.client import Dispatch import win32gui import win32api import win32con # Константы IMGX, IMGY = 359, 288 GENERIC_READ = 0x80000000 CLSCTX_INPROC_SERVER = 1 WICDecodeMetadataCacheOnDemand = 0 WICBitmapDitherTypeNone = 0 WICBitmapCacheOnDemand = 1 WICBitmapLockWrite = 2 def load_image_wic(filepath): pythoncom.CoInitialize() try: # Создаём WIC фабрику wic_factory = Dispatch("WICImagingFactory") # Декодер из файла decoder = wic_factory.CreateDecoderFromFilename(filepath, None, GENERIC_READ, WICDecodeMetadataCacheOnDemand) # Первый кадр frame = decoder.GetFrame(0) # Конвертер в 32bppPBGRA converter = wic_factory.CreateFormatConverter() converter.Initialize(frame, pythoncom.MakeIID("{6FDDC324-4E03-4BFE-B185-3D77768DC910}"), WICBitmapDitherTypeNone) # Создаём WICBitmap bitmap = wic_factory.CreateBitmapFromSource(converter, WICBitmapCacheOnDemand) # Размеры width, height = frame.GetSize() # Блокировка для доступа к пикселям rect = (0, 0, width, height) lock = bitmap.Lock(rect, WICBitmapLockWrite) # Получаем указатель на данные data = lock.GetDataPointer() # возвращает tuple (size, pointer) buf_size, buf_ptr = data # Создаём HBITMAP из сырых данных hbitmap = win32gui.CreateBitmap(width, height, 1, 32, buf_ptr) # Освобождаем lock.Release() bitmap.Release() converter.Release() frame.Release() decoder.Release() return hbitmap, width, height finally: pythoncom.CoUninitialize() def scale_hbitmap(hsrc, src_w, src_h, dst_w, dst_h): # Создаём совместимый DC и битмап hdc_screen = win32gui.GetDC(0) hdc_src = win32gui.CreateCompatibleDC(hdc_screen) hdc_dst = win32gui.CreateCompatibleDC(hdc_screen) hbmp_dst = win32gui.CreateCompatibleBitmap(hdc_screen, dst_w, dst_h) win32gui.SelectObject(hdc_src, hsrc) win32gui.SelectObject(hdc_dst, hbmp_dst) win32gui.SetStretchBltMode(hdc_dst, win32con.HALFTONE) win32gui.StretchBlt(hdc_dst, 0, 0, dst_w, dst_h, hdc_src, 0, 0, src_w, src_h, win32con.SRCCOPY) win32gui.DeleteDC(hdc_src) win32gui.DeleteDC(hdc_dst) win32gui.ReleaseDC(0, hdc_screen) return hbmp_dst # Оконная процедура def wnd_proc(hwnd, msg, wparam, lparam): if msg == win32con.WM_CREATE: # Загружаем через WIC hbmp_raw, w, h = load_image_wic("355.webp") # Масштабируем hbmp_scaled = scale_hbitmap(hbmp_raw, w, h, IMGX, IMGY) win32gui.DeleteObject(hbmp_raw) # Создаём статик hstatic = win32gui.CreateWindowEx(0, "STATIC", "", win32con.WS_CHILD | win32con.WS_VISIBLE | win32con.SS_BITMAP, 0, 0, 0, 0, hwnd, 100, None, None) win32gui.SendMessage(hstatic, win32con.STM_SETIMAGE, win32con.IMAGE_BITMAP, hbmp_scaled) return 0 elif msg == win32con.WM_DESTROY: win32gui.PostQuitMessage(0) return 0 return win32gui.DefWindowProc(hwnd, msg, wparam, lparam) # Главная функция def main(): wc = win32gui.WNDCLASS() wc.lpszClassName = "WIC_TEST" wc.hbrBackground = win32con.COLOR_WINDOW + 1 wc.lpfnWndProc = wnd_proc wc.hInstance = win32api.GetModuleHandle(None) atom = win32gui.RegisterClass(wc) hwnd = win32gui.CreateWindowEx(0, wc.lpszClassName, "WIC", win32con.WS_OVERLAPPEDWINDOW | win32con.WS_VISIBLE, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, IMGX+16, IMGY+39, None, None, wc.hInstance, None) win32gui.PumpMessages() if __name__ == "__main__": main() Или вот: Код (Python): import win32gui import win32api import win32con import win32com.client import pythoncom import ctypes from ctypes import wintypes, memmove, addressof, create_string_buffer # Константы IMGX, IMGY = 359, 288 GENERIC_READ = 0x80000000 CLSCTX_INPROC_SERVER = 1 WICDecodeMetadataCacheOnDemand = 0 WICBitmapDitherTypeNone = 0 WICBitmapCacheOnDemand = 1 WICBitmapLockWrite = 2 # GUID для 32bppPBGRA (поддержка прозрачности) GUID_WICPixelFormat32bppPBGRA = "{6FDDC324-4E03-4BFE-B185-3D77768DC910}" def load_image_wic(filepath): """Загружает изображение через WIC и возвращает (HBITMAP, width, height)""" pythoncom.CoInitialize() try: # Создаём фабрику WIC wic_factory = win32com.client.Dispatch("WICImagingFactory") # Декодируем файл decoder = wic_factory.CreateDecoderFromFilename( filepath, None, GENERIC_READ, WICDecodeMetadataCacheOnDemand ) frame = decoder.GetFrame(0) # первый кадр # Конвертируем в 32bppPBGRA converter = wic_factory.CreateFormatConverter() converter.Initialize(frame, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone) # Создаём WICBitmap wic_bitmap = wic_factory.CreateBitmapFromSource(converter, WICBitmapCacheOnDemand) # Размеры width, height = frame.GetSize() # Блокируем для чтения пикселей rect = (0, 0, width, height) lock = wic_bitmap.Lock(rect, WICBitmapLockWrite) # Получаем указатель на данные и размер буфера # В win32com GetDataPointer возвращает целое (адрес) buffer_ptr = lock.GetDataPointer() # это int - адрес памяти buffer_size = width * height * 4 # 32 бита на пиксель # Копируем данные из памяти WIC в Python bytes buffer = (ctypes.c_ubyte * buffer_size).from_address(buffer_ptr) pixel_data = bytes(buffer) # Создаём HBITMAP с помощью CreateDIBitmap (работает с 32-битными данными) hdc = win32gui.GetDC(0) # Заполняем структуру BITMAPINFOHEADER bmi = win32gui.GetObject(win32gui.CreateBitmap(width, height, 1, 32, None)) # Создаём DIB-секцию hbitmap = win32gui.CreateDIBitmap( hdc, (width, height, 1, 32, 0, 0, 0, 0, 0, 0, 0, 0), # упрощённый вариант pixel_data, win32con.DIB_RGB_COLORS ) # Альтернативный, более простой способ: создать совместимый битмап и залить через SetDIBits hbitmap = win32gui.CreateCompatibleBitmap(hdc, width, height) # Установка пикселей через SetDIBits bmi = (width, height, 1, 32, 0, 0, 0, 0, 0, 0, 0, 0) # упрощённо win32gui.SetDIBits(hdc, hbitmap, 0, height, pixel_data, bmi, win32con.DIB_RGB_COLORS) win32gui.ReleaseDC(0, hdc) # Освобождаем COM lock.Release() wic_bitmap.Release() converter.Release() frame.Release() decoder.Release() return hbitmap, width, height finally: pythoncom.CoUninitialize() def scale_hbitmap(hsrc, src_w, src_h, dst_w, dst_h): """Масштабирует HBITMAP до dst_w x dst_h""" hdc_screen = win32gui.GetDC(0) hdc_src = win32gui.CreateCompatibleDC(hdc_screen) hdc_dst = win32gui.CreateCompatibleDC(hdc_screen) hbmp_dst = win32gui.CreateCompatibleBitmap(hdc_screen, dst_w, dst_h) win32gui.SelectObject(hdc_src, hsrc) win32gui.SelectObject(hdc_dst, hbmp_dst) win32gui.SetStretchBltMode(hdc_dst, win32con.HALFTONE) win32gui.StretchBlt(hdc_dst, 0, 0, dst_w, dst_h, hdc_src, 0, 0, src_w, src_h, win32con.SRCCOPY) win32gui.DeleteDC(hdc_src) win32gui.DeleteDC(hdc_dst) win32gui.ReleaseDC(0, hdc_screen) return hbmp_dst # Оконная процедура def wnd_proc(hwnd, msg, wparam, lparam): if msg == win32con.WM_CREATE: try: # Загружаем через WIC hbmp_raw, w, h = load_image_wic("355.webp") # Масштабируем hbmp_scaled = scale_hbitmap(hbmp_raw, w, h, IMGX, IMGY) win32gui.DeleteObject(hbmp_raw) # Создаём статик hstatic = win32gui.CreateWindowEx( 0, "STATIC", "", win32con.WS_CHILD | win32con.WS_VISIBLE | win32con.SS_BITMAP, 0, 0, 0, 0, hwnd, 100, None, None ) win32gui.SendMessage(hstatic, win32con.STM_SETIMAGE, win32con.IMAGE_BITMAP, hbmp_scaled) # Принудительная перерисовка win32gui.InvalidateRect(hstatic, None, True) except Exception as e: win32gui.MessageBox(hwnd, str(e), "Ошибка загрузки", 0) return 0 elif msg == win32con.WM_DESTROY: win32gui.PostQuitMessage(0) return 0 return win32gui.DefWindowProc(hwnd, msg, wparam, lparam) def main(): wc = win32gui.WNDCLASS() wc.lpszClassName = "WIC_TEST" wc.hbrBackground = win32con.COLOR_WINDOW + 1 wc.lpfnWndProc = wnd_proc wc.hInstance = win32api.GetModuleHandle(None) win32gui.RegisterClass(wc) hwnd = win32gui.CreateWindowEx( 0, wc.lpszClassName, "WIC Image Viewer", win32con.WS_OVERLAPPEDWINDOW | win32con.WS_VISIBLE, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, IMGX + 16, IMGY + 39, None, None, wc.hInstance, None ) # Цикл сообщений (стандартный) msg = win32gui.GetMessage(None, 0, 0) while msg[0] != 0: win32gui.TranslateMessage(msg[1]) win32gui.DispatchMessage(msg[1]) msg = win32gui.GetMessage(None, 0, 0) if __name__ == "__main__": main() з.ы. Нет никаких llm. Внутри сидят тысячи китайцев. Сегодня все кто могли в погромирование уехали на обед на автобусе. И неизвестно когда новый рейс приедет.
Вачёвски действительно добровольно стали евнухами. Если тут и есть троллинг, то очень странный и с их стороны.