Skip to main content

A performant web native pixel delivery pipeline for diverse sources, blending VNC-inspired parallel processing of pixel buffers with flexible modern encoding formats.

Project description

pixelflux

PyPI version License: MPL 2.0

A performant web native pixel delivery pipeline for diverse sources, blending VNC-inspired parallel processing of pixel buffers with flexible modern encoding formats.

This module provides a Python interface to a high-performance C++ capture library. It captures pixel data from a source (currently X11 screen regions), detects changes, and encodes modified stripes into JPEG or H.264, delivering them via a callback mechanism. This stripe-based, change-driven approach is designed for efficient streaming or processing of visual data.

Installation

This module relies on a native C++ extension that is compiled during installation using your system's C++ compiler.

  1. Prerequisites (for the current X11 backend on Debian/Ubuntu): Ensure you have a C++ compiler (g++) and development files for Python, X11, Xext (XShm), libjpeg-turbo, and libx264.
sudo apt-get update && \
sudo apt-get install -y \
  g++ \
  libjpeg-turbo8-dev \
  libx11-dev \
  libxfixes-dev \
  libxext-dev \
  libx264-dev \
  python3-dev
  1. Install the Package: You can install directly from PyPI or from a local source clone.

    Option A: Install from PyPI

    pip install pixelflux
    

    Option B: Install from a local source directory

    # From the root of the project repository
    pip install .
    

    This command will use setuptools to directly compile the C++ extension (screen_capture_module.cpp) and install it alongside the Python code into your environment.

    Note: The current backend is designed and tested for Linux/X11 environments.

Usage

Basic Capture

Here is a basic example demonstrating how to use the pixelflux module to start capturing and process encoded stripes.

import time
from pixelflux import CaptureSettings, ScreenCapture, StripeCallback

# Define your Python callback function.
# This function will be called from a background thread for each encoded stripe.
def my_python_callback(result, user_data):
    """
    Callback function to process encoded stripes.
    `result` is a StripeEncodeResult object with the stripe's data.
    `user_data` is whatever object you passed to start_capture (or None).
    """
    if result.data:
        # result.type will be 1 for JPEG, 2 for H.264
        type_str = "H264" if result.type == 2 else "JPEG"

        print(
            f"Received {type_str} stripe: "
            f"frame_id={result.frame_id}, "
            f"y_start={result.stripe_y_start}, "
            f"height={result.stripe_height}, "
            f"size={len(result.data)} bytes"
        )
    
    # Memory is managed automatically. No need to free anything.

# 1. Configure capture settings
settings = CaptureSettings()
settings.capture_width = 1280
settings.capture_height = 720
settings.capture_x = 0
settings.capture_y = 0
settings.target_fps = 30.0

# Set output mode to H.264 (1)
settings.output_mode = 1
settings.h264_crf = 25 # H264 Constant Rate Factor (0-51, lower is better quality)

# 2. Instantiate the ScreenCapture module
module = ScreenCapture()

# 3. Create a StripeCallback handler object
# This object simply holds your Python function.
callback_handler = StripeCallback(my_python_callback)

try:
    # 4. Start the capture, passing the settings and callback handler.
    # The third argument is optional user_data to be passed to your callback.
    module.start_capture(settings, callback_handler, None)
    
    print("Capture started. Press Enter to stop...")
    input() # Keep the main thread alive while capture runs in the background.

finally:
    # 5. Stop the capture. This will block until the background thread has exited.
    module.stop_capture()
    print("Capture stopped.")

Capture Settings

The CaptureSettings class allows for detailed configuration of the capture process.

# All attributes of the CaptureSettings object are standard Python properties.
settings = CaptureSettings()

# Core Capture
settings.capture_width = 1920
settings.capture_height = 1080
settings.capture_x = 0
settings.capture_y = 0
settings.target_fps = 60.0
settings.capture_cursor = True

# Encoding Mode (0 for JPEG, 1 for H.264)
settings.output_mode = 1

# JPEG Quality Settings
settings.jpeg_quality = 75              # Quality for changed stripes (0-100)
settings.paint_over_jpeg_quality = 90   # Quality for static "paint-over" stripes (0-100)

# H.264 Quality Settings
settings.h264_crf = 23                  # CRF value (0-51, lower is better quality/higher bitrate)
settings.h264_fullcolor = False         # Use I444 (full color) instead of I420
settings.h264_fullframe = False         # Encode full frames instead of just changed stripes

# Change Detection & Optimization
settings.use_paint_over_quality = True  # Enable paint-over/IDR requests for static regions
settings.paint_over_trigger_frames = 15 # Frames of no motion to trigger paint-over
settings.damage_block_threshold = 10    # Consecutive changes to trigger "damaged" state
settings.damage_block_duration = 30     # Frames a stripe stays "damaged"

# Watermarking
settings.watermark_path = b"/path/to/your/watermark.png" # Must be bytes
settings.watermark_location_enum = 4 # 0:None, 1:TL, 2:TR, 3:BL, 4:BR, 5:Middle, 6:Animated

Stripe Callback and Data Structure

The start_capture function requires a StripeCallback object, which wraps your Python function. This function is invoked from a C++ background thread whenever an encoded stripe is ready.

Your callback function will receive two arguments:

  1. result: A StripeEncodeResult object containing the stripe data.
  2. user_data: The optional object you passed to start_capture.

The StripeEncodeResult object has the following read-only properties:

class StripeEncodeResult:
    # This is illustrative. You do not define this class.
    # You receive an instance of it in your callback.

    @property
    def type(self) -> int: ... # StripeDataType: 1 for JPEG, 2 for H.264

    @property
    def stripe_y_start(self) -> int: ...

    @property
    def stripe_height(self) -> int: ...

    @property
    def size(self) -> int: ... # The size of the data in bytes

    @property
    def data(self) -> bytes: ... # The encoded stripe data as a Python bytes object

    @property
    def frame_id(self) -> int: ... # Frame counter for this stripe

Memory Management: The memory for the stripe data is managed automatically. When the StripeEncodeResult object received by your callback is garbage-collected by Python, its internal C++ destructor is called, which frees the underlying data buffer. You do not need to do any manual memory management.

Features

  • Efficient Pixel Capture: Leverages a native C++ module using XShm for optimized X11 screen capture performance.
  • Stripe-Based Encoding (JPEG & H.264): Encodes captured frames into horizontal stripes, processed in parallel using a number of threads based on system core count. Each stripe is an independent data unit.
  • Change Detection: Encodes only stripes that have changed (based on XXH3 hash comparison) since the last frame, significantly reducing processing load and bandwidth. This approach is inspired by VNC.
  • Configurable Capture Region: Specify the exact X, Y, width, and height of the screen region to capture.
  • Adjustable FPS, Quality, and Encoding Parameters: Control frame rate, JPEG quality (0-100), and H.264 CRF (0-51).
  • Dynamic Quality Optimizations:
    • Paint-Over for Static Regions: After a stripe remains static for paint_over_trigger_frames, it is resent. For JPEG, this uses paint_over_jpeg_quality if use_paint_over_quality is true. For H.264, this triggers a request for an IDR frame for that stripe, ensuring a full refresh.
    • Adaptive Behavior for Highly Active Stripes (Damage Throttling):
      • Identifies stripes that change very frequently (exceeding damage_block_threshold updates).
      • For these "damaged" stripes, damage checks are done less frequently, saving resources on high motion.
      • For JPEG output, the quality of these frequently changing stripes dynamically adjusts (reducing slightly on change) and resets to higher base/paint-over quality after a cooldown period of damage_block_duration frames. This manages resources effectively for volatile content.
  • Direct Callback Mechanism: Provides encoded stripe data, including a custom header, directly to your Python code for real-time processing or streaming.

Example: Real-time H.264 Streaming with WebSockets

A comprehensive example, screen_to_browser.py, is located in the example directory of this repository. This script demonstrates robust, real-time screen capture, H.264 encoding, and streaming via WebSockets. It sets up:

  • An asyncio-based WebSocket server to stream encoded H.264 stripes.
  • An HTTP server to serve a client-side HTML page for viewing the stream.
  • The pixelflux module to perform the screen capture and encoding, with proper asynchronous shutdown logic to prevent deadlocks.

To run this example:

Note: This example assumes you are on a Linux host with a running X11 session and will only work from localhost unless HTTPS is added.

  1. First, ensure you have the websockets library installed (it is a dependency for the example, not the library itself):

    pip install websockets
    
  2. Navigate to the example directory within the repository:

    cd example
    
  3. Execute the Python script:

    python3 screen_to_browser.py
    
  4. Open your web browser and go to the URL indicated by the script's output (usually http://localhost:9001/index.html) to view the live stream.

License

This project is licensed under the Mozilla Public License Version 2.0. A copy of the MPL 2.0 can be found at https://mozilla.org/MPL/2.0/.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pixelflux-1.2.1.tar.gz (51.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pixelflux-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl (4.8 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

pixelflux-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

pixelflux-1.2.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pixelflux-1.2.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (2.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

pixelflux-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl (4.8 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

pixelflux-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

pixelflux-1.2.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pixelflux-1.2.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (2.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

pixelflux-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl (4.8 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

pixelflux-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

pixelflux-1.2.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pixelflux-1.2.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (2.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

pixelflux-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl (4.8 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

pixelflux-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

pixelflux-1.2.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pixelflux-1.2.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (2.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

pixelflux-1.2.1-cp39-cp39-musllinux_1_2_x86_64.whl (4.8 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

pixelflux-1.2.1-cp39-cp39-musllinux_1_2_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ ARM64

pixelflux-1.2.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pixelflux-1.2.1-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (2.4 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

pixelflux-1.2.1-cp38-cp38-musllinux_1_2_x86_64.whl (4.8 MB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ x86-64

pixelflux-1.2.1-cp38-cp38-musllinux_1_2_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ ARM64

pixelflux-1.2.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pixelflux-1.2.1-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (2.4 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

File details

Details for the file pixelflux-1.2.1.tar.gz.

File metadata

  • Download URL: pixelflux-1.2.1.tar.gz
  • Upload date:
  • Size: 51.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.2

File hashes

Hashes for pixelflux-1.2.1.tar.gz
Algorithm Hash digest
SHA256 0222909ae6b8fdc726fd1c23d926ce66688cdb09dd24602a18da6564e62ecea6
MD5 e74b8a2a66c8de69d5c19024f6bd4e04
BLAKE2b-256 a3a45b24126f4226e8cc2380c9213a73bc1a9d678e4843560778bd5c713aa140

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1b969858b66bb681f1a89a54803bc0f563b658481e43025dc1931acb935556bb
MD5 7f1b6ceca3fc27ede8b86b5ecc6bd24e
BLAKE2b-256 c4fa6cee00b67ffe677ed8117021904aa963882f21a7cfef8abb6d22c98a5fca

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 66207b956ea9ba783d4a6248551ae412492b1c8c5525684b57652e057cbc7e62
MD5 00c5c4b25934fbd8527b01a50a8a2200
BLAKE2b-256 a8035c16152945b84d4f7bac6053b2421cde5e4b35e92d03d844d2411d98406c

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f4d645b7ce01b5416490094190bc8b850d575036fe0b592dc69bcf9bbc66350b
MD5 7dfcd12d2d79dad6deffaf1d5b2cdda5
BLAKE2b-256 d95e32ba9dfb5a23276a16e81eeb6febb63d5c6b41afa7e39e691067e875fb6f

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d6779973fd41075dca97e607abd7c2d4d4aa58889c51b7e4625d06e2ae52cbc3
MD5 27dc05a99dbb7a9735099cdb3d5c64d6
BLAKE2b-256 5e1c084d01e2547add5cc5d8dd6c00b1ed08eac83809ce02b68c190c40782467

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 de9834c90ea4547675cea42dc8cf559eec7a8488336d8eb6c57c8a1e72473969
MD5 438eaf1bd6ab7eb29f27d985f4d2f139
BLAKE2b-256 fbb740149fa732b7520a9d76d32ee42fa255bffdd31da3210813cf6d0a85d855

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 de38701ecc129e70e94e82fecddc6051b279841d3cd023fe440b9985a9b07ebe
MD5 5cbf534f216ac31d400c81fddd43ab09
BLAKE2b-256 f794c7aaaa4d9df3fc695e253088555a513cf0674c57502b5ee44b59eb5fe87d

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b008373fc392daca700b0055d4ba60bd0734da5edc0a6ccbd7d66426a3a5c199
MD5 ee10a6c76ede13b4076dc4b8c4dbd25d
BLAKE2b-256 55da351a0177e80d026bb09744178a1527badda4cdc5a4652297e0b4fafc207b

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c088da01e2fa9da4885bee007e76064d5f3f96d40b475f7ef18ca59ebd55494f
MD5 c8074b081e011c5223413f57f8113898
BLAKE2b-256 0c7a84298c8421570cd806c4910dd56fb1821e3c283746369fa5e79b38bb3228

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d296b97fc93933c4d68028bfcaf6570276c0311f87ac50f627d88bb8dbab26e6
MD5 4aeb0a34ecac261ff521260b09323a41
BLAKE2b-256 ce26e719e88263d0caa0589e963acdb7424c19854379155bce817bf8d52bba56

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f09ecfff0037e6cf85c12a96685545b31277578a81db198fd75a87c6e3b1adea
MD5 876f1082faa717eba01f63f414abc6b2
BLAKE2b-256 b3714bf04875cdc32ae3ffdb7e68277b423e879b9718c902cc24334976805545

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3c3b34d017e424cb2bcba84e8906eb510e83a128579ac2b201211661e659ea00
MD5 bc5d687f5a6a395bb76eab9d334528f3
BLAKE2b-256 d5611d6ada1856fd8ee2f262c0ae0572578d21cbdf002bade747f2612d265f7f

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1517fdfcfe77aee14a031824c057e019e9bcb3d3644f4d90fb639d5af51b66a5
MD5 36822a132e054ff1d6195c14372665ea
BLAKE2b-256 ef5c28ecb5d10035acadba6214bf0eaf7e2709521b25149e37e806a91d06e7e3

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e8bea2f1f9114188e7f4895b931af9caf38487df1e9266abcc5e31abff82e11c
MD5 791b43ff9d9d70b22e6db95e27c783c4
BLAKE2b-256 745a01f5ad418789766cef1a0e8993d1597b9fce34c576c18de34690a492f3c8

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 73327381f288ace31230c26c11985b93a96fa79af2ad540023de1bedfbcf63f9
MD5 eb7e5d485c8421e00cc79c3bff31894b
BLAKE2b-256 6fb5ecb612c33c77929dee8821f73441d07ba7949534c618c2e212cf0358e4af

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 09b6f693442d334197de629f8fa96ba3ce24485b626f4648c6d40fbd7af5261b
MD5 4c484af3da6dc16829f812349e8ed99b
BLAKE2b-256 47c6ff65c5558b2c17fb0986fed4d888b3bd645623ad4887f5f16677309dec54

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d7573ec8f5c22d8a1af6d661cfc38523100b1132752f5be656c700a3a011f27a
MD5 b3ce4f632bcf48b37a4f3ed3d6d3095e
BLAKE2b-256 313782b8e6c68542651c358e510615856440ab21ddd122688e603b315ef45bd2

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 28ccaa7732cc845683328a86707de5cb6ba202f55a51b07306b2affafaf6b9a7
MD5 9d83039395c33e308eaa40bbd9884e1a
BLAKE2b-256 bcd2660b9d25491b7b8c7d4f6fc00b8afef3895881d99024a624657ea5ab5050

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp39-cp39-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp39-cp39-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 0f054e9ac96b4f394fc3bd51e62236d35605f363322839cfe4448fa1617291d6
MD5 065299147d62f224d2a23c052eb11686
BLAKE2b-256 eaca353da012b496cf4919aa4eabf0a86334aa03d41b7b9a1eb12206ec14b6c4

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 498fe0a17e541b4f3eb17aeeec29fdb27da2ad48148ae2308b55da8d52fe6cd9
MD5 fd484592894fc3f39886c20a5e173aeb
BLAKE2b-256 c6fe058e52c2b889e3c7067d0af6402206f9dc785902212c891919eab655d1c7

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0fdd0afa035488cfe82c62f19a2f40b54813c07fecd1b441e5354ecb7b7992c1
MD5 53089d73e3c17e1c87f0ffa21647e214
BLAKE2b-256 598108098f1fa51fc795634fce84a324dbe081d1b14c2e876d6c67cccf4bbb2c

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp38-cp38-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9a9435699b8837653e6a22f9979a4ce806cb199c5dc7ff4b85b98e7c11134200
MD5 b5a8755cbeca21e5dd4592bc162e46f3
BLAKE2b-256 e21dd128b755dddd8aa207045b896aeca444630ae26105a533488f8f5d85743d

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp38-cp38-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp38-cp38-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 057dd69b5f41768eefd87c4ac136e229ba8a7623503cae2a3f46e547f212c73c
MD5 b788f175127bdd594ec980fcf2101e5f
BLAKE2b-256 c61c7aec5bc49615a22bdb7b2b5ea72d78a07a34bf19514bf1e197d6c6c7fc1f

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 390d5ab51257b15034922ed53a70881bad48dc7bc7ee6ad7b40ef2a42793a5b0
MD5 4f00294799c5df148cd34e63f3a24c76
BLAKE2b-256 254f619f6f8d43388336139e962dcb62f81744e40fd9ffc41345d8a2c5bf5483

See more details on using hashes here.

File details

Details for the file pixelflux-1.2.1-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pixelflux-1.2.1-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f48fc4835a0a3e0cb5e902a6a5b4f07d3bbe1c415749efc9c9e8a40f77c6f673
MD5 7f2daf6d16492281f2176c2f6446ed82
BLAKE2b-256 96dc3b0e515da2d45a971bb9678e7c1d4583f4b059960993132f4fb5c9cb7314

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page