.webp to .jpg converter

Тема в разделе "WASM.SOFTWARE", создана пользователем Research, 2 апр 2026.

  1. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    454
    Особенность конвертера - не нужно выбирать долбанные файлы
    .webp вручную - достаточно открыть .py скрипт рядом с ними.
     

    Вложения:

    Последнее редактирование: 2 апр 2026
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.222
    Research,
    просмотр содержимого WEBP на Masm. В аттаче картинка/курсор/ASM/EXE-файл
     

    Вложения:

    • WEBP.zip
      Размер файла:
      28,6 КБ
      Просмотров:
      55
    Research нравится это.
  3. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    454
    Mikl___, python повел меня по такому пути (WIC фабрики):
    Код (Python):
    1. import ctypes
    2. import ctypes.wintypes
    3. import pythoncom
    4. from win32com import universal
    5. from win32com.client import Dispatch
    6. import win32gui
    7. import win32api
    8. import win32con
    9.  
    10. # Константы
    11. IMGX, IMGY = 359, 288
    12. GENERIC_READ = 0x80000000
    13. CLSCTX_INPROC_SERVER = 1
    14. WICDecodeMetadataCacheOnDemand = 0
    15. WICBitmapDitherTypeNone = 0
    16. WICBitmapCacheOnDemand = 1
    17. WICBitmapLockWrite = 2
    18.  
    19. def load_image_wic(filepath):
    20.     pythoncom.CoInitialize()
    21.     try:
    22.         # Создаём WIC фабрику
    23.         wic_factory = Dispatch("WICImagingFactory")
    24.         # Декодер из файла
    25.         decoder = wic_factory.CreateDecoderFromFilename(filepath, None, GENERIC_READ, WICDecodeMetadataCacheOnDemand)
    26.         # Первый кадр
    27.         frame = decoder.GetFrame(0)
    28.         # Конвертер в 32bppPBGRA
    29.         converter = wic_factory.CreateFormatConverter()
    30.         converter.Initialize(frame, pythoncom.MakeIID("{6FDDC324-4E03-4BFE-B185-3D77768DC910}"), WICBitmapDitherTypeNone)
    31.         # Создаём WICBitmap
    32.         bitmap = wic_factory.CreateBitmapFromSource(converter, WICBitmapCacheOnDemand)
    33.         # Размеры
    34.         width, height = frame.GetSize()
    35.         # Блокировка для доступа к пикселям
    36.         rect = (0, 0, width, height)
    37.         lock = bitmap.Lock(rect, WICBitmapLockWrite)
    38.         # Получаем указатель на данные
    39.         data = lock.GetDataPointer()  # возвращает tuple (size, pointer)
    40.         buf_size, buf_ptr = data
    41.         # Создаём HBITMAP из сырых данных
    42.         hbitmap = win32gui.CreateBitmap(width, height, 1, 32, buf_ptr)
    43.         # Освобождаем
    44.         lock.Release()
    45.         bitmap.Release()
    46.         converter.Release()
    47.         frame.Release()
    48.         decoder.Release()
    49.         return hbitmap, width, height
    50.     finally:
    51.         pythoncom.CoUninitialize()
    52.  
    53. def scale_hbitmap(hsrc, src_w, src_h, dst_w, dst_h):
    54.     # Создаём совместимый DC и битмап
    55.     hdc_screen = win32gui.GetDC(0)
    56.     hdc_src = win32gui.CreateCompatibleDC(hdc_screen)
    57.     hdc_dst = win32gui.CreateCompatibleDC(hdc_screen)
    58.     hbmp_dst = win32gui.CreateCompatibleBitmap(hdc_screen, dst_w, dst_h)
    59.     win32gui.SelectObject(hdc_src, hsrc)
    60.     win32gui.SelectObject(hdc_dst, hbmp_dst)
    61.     win32gui.SetStretchBltMode(hdc_dst, win32con.HALFTONE)
    62.     win32gui.StretchBlt(hdc_dst, 0, 0, dst_w, dst_h, hdc_src, 0, 0, src_w, src_h, win32con.SRCCOPY)
    63.     win32gui.DeleteDC(hdc_src)
    64.     win32gui.DeleteDC(hdc_dst)
    65.     win32gui.ReleaseDC(0, hdc_screen)
    66.     return hbmp_dst
    67.  
    68. # Оконная процедура
    69. def wnd_proc(hwnd, msg, wparam, lparam):
    70.     if msg == win32con.WM_CREATE:
    71.         # Загружаем через WIC
    72.         hbmp_raw, w, h = load_image_wic("355.webp")
    73.         # Масштабируем
    74.         hbmp_scaled = scale_hbitmap(hbmp_raw, w, h, IMGX, IMGY)
    75.         win32gui.DeleteObject(hbmp_raw)
    76.         # Создаём статик
    77.         hstatic = win32gui.CreateWindowEx(0, "STATIC", "", win32con.WS_CHILD | win32con.WS_VISIBLE | win32con.SS_BITMAP,
    78.                                           0, 0, 0, 0, hwnd, 100, None, None)
    79.         win32gui.SendMessage(hstatic, win32con.STM_SETIMAGE, win32con.IMAGE_BITMAP, hbmp_scaled)
    80.         return 0
    81.     elif msg == win32con.WM_DESTROY:
    82.         win32gui.PostQuitMessage(0)
    83.         return 0
    84.     return win32gui.DefWindowProc(hwnd, msg, wparam, lparam)
    85.  
    86. # Главная функция
    87. def main():
    88.     wc = win32gui.WNDCLASS()
    89.     wc.lpszClassName = "WIC_TEST"
    90.     wc.hbrBackground = win32con.COLOR_WINDOW + 1
    91.     wc.lpfnWndProc = wnd_proc
    92.     wc.hInstance = win32api.GetModuleHandle(None)
    93.     atom = win32gui.RegisterClass(wc)
    94.     hwnd = win32gui.CreateWindowEx(0, wc.lpszClassName, "WIC",
    95.                                    win32con.WS_OVERLAPPEDWINDOW | win32con.WS_VISIBLE,
    96.                                    win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
    97.                                    IMGX+16, IMGY+39, None, None, wc.hInstance, None)
    98.     win32gui.PumpMessages()
    99.  
    100. if __name__ == "__main__":
    101.     main()
    Или вот:
    Код (Python):
    1. import win32gui
    2. import win32api
    3. import win32con
    4. import win32com.client
    5. import pythoncom
    6. import ctypes
    7. from ctypes import wintypes, memmove, addressof, create_string_buffer
    8.  
    9. # Константы
    10. IMGX, IMGY = 359, 288
    11. GENERIC_READ = 0x80000000
    12. CLSCTX_INPROC_SERVER = 1
    13. WICDecodeMetadataCacheOnDemand = 0
    14. WICBitmapDitherTypeNone = 0
    15. WICBitmapCacheOnDemand = 1
    16. WICBitmapLockWrite = 2
    17.  
    18. # GUID для 32bppPBGRA (поддержка прозрачности)
    19. GUID_WICPixelFormat32bppPBGRA = "{6FDDC324-4E03-4BFE-B185-3D77768DC910}"
    20.  
    21. def load_image_wic(filepath):
    22.     """Загружает изображение через WIC и возвращает (HBITMAP, width, height)"""
    23.     pythoncom.CoInitialize()
    24.     try:
    25.         # Создаём фабрику WIC
    26.         wic_factory = win32com.client.Dispatch("WICImagingFactory")
    27.         # Декодируем файл
    28.         decoder = wic_factory.CreateDecoderFromFilename(
    29.             filepath, None, GENERIC_READ, WICDecodeMetadataCacheOnDemand
    30.         )
    31.         frame = decoder.GetFrame(0)  # первый кадр
    32.         # Конвертируем в 32bppPBGRA
    33.         converter = wic_factory.CreateFormatConverter()
    34.         converter.Initialize(frame, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone)
    35.         # Создаём WICBitmap
    36.         wic_bitmap = wic_factory.CreateBitmapFromSource(converter, WICBitmapCacheOnDemand)
    37.         # Размеры
    38.         width, height = frame.GetSize()
    39.         # Блокируем для чтения пикселей
    40.         rect = (0, 0, width, height)
    41.         lock = wic_bitmap.Lock(rect, WICBitmapLockWrite)
    42.         # Получаем указатель на данные и размер буфера
    43.         # В win32com GetDataPointer возвращает целое (адрес)
    44.         buffer_ptr = lock.GetDataPointer()   # это int - адрес памяти
    45.         buffer_size = width * height * 4     # 32 бита на пиксель
    46.         # Копируем данные из памяти WIC в Python bytes
    47.         buffer = (ctypes.c_ubyte * buffer_size).from_address(buffer_ptr)
    48.         pixel_data = bytes(buffer)
    49.         # Создаём HBITMAP с помощью CreateDIBitmap (работает с 32-битными данными)
    50.         hdc = win32gui.GetDC(0)
    51.         # Заполняем структуру BITMAPINFOHEADER
    52.         bmi = win32gui.GetObject(win32gui.CreateBitmap(width, height, 1, 32, None))
    53.         # Создаём DIB-секцию
    54.         hbitmap = win32gui.CreateDIBitmap(
    55.             hdc,
    56.             (width, height, 1, 32, 0, 0, 0, 0, 0, 0, 0, 0),  # упрощённый вариант
    57.             pixel_data,
    58.             win32con.DIB_RGB_COLORS
    59.         )
    60.         # Альтернативный, более простой способ: создать совместимый битмап и залить через SetDIBits
    61.         hbitmap = win32gui.CreateCompatibleBitmap(hdc, width, height)
    62.         # Установка пикселей через SetDIBits
    63.         bmi = (width, height, 1, 32, 0, 0, 0, 0, 0, 0, 0, 0)  # упрощённо
    64.         win32gui.SetDIBits(hdc, hbitmap, 0, height, pixel_data, bmi, win32con.DIB_RGB_COLORS)
    65.         win32gui.ReleaseDC(0, hdc)
    66.         # Освобождаем COM
    67.         lock.Release()
    68.         wic_bitmap.Release()
    69.         converter.Release()
    70.         frame.Release()
    71.         decoder.Release()
    72.         return hbitmap, width, height
    73.     finally:
    74.         pythoncom.CoUninitialize()
    75.  
    76. def scale_hbitmap(hsrc, src_w, src_h, dst_w, dst_h):
    77.     """Масштабирует HBITMAP до dst_w x dst_h"""
    78.     hdc_screen = win32gui.GetDC(0)
    79.     hdc_src = win32gui.CreateCompatibleDC(hdc_screen)
    80.     hdc_dst = win32gui.CreateCompatibleDC(hdc_screen)
    81.     hbmp_dst = win32gui.CreateCompatibleBitmap(hdc_screen, dst_w, dst_h)
    82.     win32gui.SelectObject(hdc_src, hsrc)
    83.     win32gui.SelectObject(hdc_dst, hbmp_dst)
    84.     win32gui.SetStretchBltMode(hdc_dst, win32con.HALFTONE)
    85.     win32gui.StretchBlt(hdc_dst, 0, 0, dst_w, dst_h, hdc_src, 0, 0, src_w, src_h, win32con.SRCCOPY)
    86.     win32gui.DeleteDC(hdc_src)
    87.     win32gui.DeleteDC(hdc_dst)
    88.     win32gui.ReleaseDC(0, hdc_screen)
    89.     return hbmp_dst
    90.  
    91. # Оконная процедура
    92. def wnd_proc(hwnd, msg, wparam, lparam):
    93.     if msg == win32con.WM_CREATE:
    94.         try:
    95.             # Загружаем через WIC
    96.             hbmp_raw, w, h = load_image_wic("355.webp")
    97.             # Масштабируем
    98.             hbmp_scaled = scale_hbitmap(hbmp_raw, w, h, IMGX, IMGY)
    99.             win32gui.DeleteObject(hbmp_raw)
    100.             # Создаём статик
    101.             hstatic = win32gui.CreateWindowEx(
    102.                 0, "STATIC", "",
    103.                 win32con.WS_CHILD | win32con.WS_VISIBLE | win32con.SS_BITMAP,
    104.                 0, 0, 0, 0, hwnd, 100, None, None
    105.             )
    106.             win32gui.SendMessage(hstatic, win32con.STM_SETIMAGE, win32con.IMAGE_BITMAP, hbmp_scaled)
    107.             # Принудительная перерисовка
    108.             win32gui.InvalidateRect(hstatic, None, True)
    109.         except Exception as e:
    110.             win32gui.MessageBox(hwnd, str(e), "Ошибка загрузки", 0)
    111.         return 0
    112.     elif msg == win32con.WM_DESTROY:
    113.         win32gui.PostQuitMessage(0)
    114.         return 0
    115.     return win32gui.DefWindowProc(hwnd, msg, wparam, lparam)
    116.  
    117. def main():
    118.     wc = win32gui.WNDCLASS()
    119.     wc.lpszClassName = "WIC_TEST"
    120.     wc.hbrBackground = win32con.COLOR_WINDOW + 1
    121.     wc.lpfnWndProc = wnd_proc
    122.     wc.hInstance = win32api.GetModuleHandle(None)
    123.     win32gui.RegisterClass(wc)
    124.     hwnd = win32gui.CreateWindowEx(
    125.         0, wc.lpszClassName, "WIC Image Viewer",
    126.         win32con.WS_OVERLAPPEDWINDOW | win32con.WS_VISIBLE,
    127.         win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
    128.         IMGX + 16, IMGY + 39,
    129.         None, None, wc.hInstance, None
    130.     )
    131.     # Цикл сообщений (стандартный)
    132.     msg = win32gui.GetMessage(None, 0, 0)
    133.     while msg[0] != 0:
    134.         win32gui.TranslateMessage(msg[1])
    135.         win32gui.DispatchMessage(msg[1])
    136.         msg = win32gui.GetMessage(None, 0, 0)
    137.  
    138. if __name__ == "__main__":
    139.     main()
    з.ы. Нет никаких llm. Внутри сидят тысячи китайцев. Сегодня все кто могли в погромирование уехали на обед на автобусе. И неизвестно когда новый рейс приедет.
     
    Последнее редактирование: 4 апр 2026
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.222
    :scratch_one-s_head: Ну и слава богу, а то я уже волноваться начал
     
  5. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    454
    Иногда там сидят троли. Смогут ли другие затролить их так же?

    2026-04-04_20-33-00.png
     
    Mikl___ нравится это.
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    Вачёвски действительно добровольно стали евнухами. Если тут и есть троллинг, то очень странный и с их стороны.
     
    Mikl___ нравится это.
  7. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    454
    Выбрали не ту таблетку.