# CXX Image IO




[](https://github.com/sygslhy/image-io/blob/main/LICENSE.md)

[](https://github.com/sygslhy/image-io/actions/workflows/wheels.yml)
[](https://github.com/sygslhy/image-io/actions/workflows/schedule.yml)
# What's new since `v1.1.1`
Since version `v1.1.1`, `cxx-image-io` supports reading Bayer RAW images from reflex cameras into numpy.array, while also parsing some EXIF information. It is integrated with the C++ library .
The RAW image formats of the following camera manufacturers are supported, user can open these camera raw files by `read_image`, get image as `numpy.array` format:
| Camera manufacturer | Image format |
|---------------------|--------------|
| Canon | CR2 |
| Nikon | NEF |
| Sony | ARW |
| Panasonic | RW2 |
| Kodak | DCR |
| Samsung | SRW |
| Olympus | ORF |
| Leica | RAW |
| Pentax | PEF |
# Introduction
CXX Image IO is a Python project which provides the image IO interfaces, binding with the C++ library: https://github.com/emmcb/cxx-image.
These IO interfaces are designed to read and write images in many file formats in generic way and to interact nicely with numpy array.
| Image format | Read | Write | EXIF | Pixel precision | Pixel type | File extension | Sidecar needed |
|---------------|------|--------|------|------------------------|----------------------|----------------------------------|------------------|
| BMP | x | x | | 8 bits | Grayscale, RGB, RGBA | .bmp | |
| CFA | x | x | | 16 bits | Bayer | .cfa | |
| DNG | x | x | x | 16 bits, float | Bayer, RGB | .dng | |
| JPEG | x | x | x | 8 bits | Grayscale, RGB | .jpg, .jpeg | |
| MIPI RAW | x | x | | 10 bits, 12 bits | Bayer | .RAWMIPI, .RAWMIPI10, .RAWMIPI12 | x |
| PLAIN RAW | x | x | | * | * | .raw .plain16, .nv12, .yuv, * | x |
| PNG | x | x | | 8 bits, 16 bits | Grayscale, RGB, RGBA | .png | |
| TIFF | x | x | x | 8 bits, 16 bits, float | Bayer, RGB | .tif, .tiff | |
# Getting Started
## Prerequisites
This projet currently supports Python from `3.9` to `3.13` on
- Windows: `x86_64`
- Linux: `x86_64` and `aarch64`, glibc `v2.28+`, musl libc `v1.2+`
- MacOS: `x86_64` and `arm64`, `v11.0+`
## Installation
The python package `cxx-image-io` is to be installed by `pip`
```sh
pip install cxx-image-io
```
# Usage
## Image reading basic example
`read_image` is able to read a image file and return a numpy array and ImageMetadata object.
~~~~~~~~~~~~~~~{.python}
from cxx_image_io import read_image
from cxx_image_io import ImageMetadata
import numpy as np
from pathlib import Path
image, metadata = read_image(Path('/path/to/image.jpg'))
assert isinstance(image, np.ndarray)
print('Type:', image.dtype)
print('Shape:', image.shape)
~~~~~~~~~~~~~~~
image is a numpy array which is suitable for the image processing afterwards.
The print result could be like this:
~~~~~~~~~~~~~~~{.sh}
Type: uint8
Shape: (551, 603, 3)
~~~~~~~~~~~~~~~
`ImageMetadata` is the information about the image, the component `fileInfo` including the pixel type, pixel precision and image layout, which define fundamentally how the pixels arranged in buffer.
~~~~~~~~~~~~~~~{.python}
print(metadata.fileInfo)
~~~~~~~~~~~~~~~
The print result could be like this:
~~~~~~~~~~~~~~~{.sh}
{'pixelPrecision': 8, 'imageLayout': 'interleaved', 'pixelType': 'rgb'}
~~~~~~~~~~~~~~~
`metadata.fileInfo` shows: `image` is a 3-dimensional numpy array, where rgb 3 channels interleaved, in each channel, pixel depth is 8 bits.
`ImageMetadata` has more components than `fileInfo`, it also includes `ExifMetadata`, `help(ImageMetadata)` will show the details.
### Read Camera manufacturer RAW image example:
reading camera manufacturer raw image is the same method as we read from .jpg or .tif, just call `read_image`.
~~~~~~~~~~~~~~~{.python}
from cxx_image_io import read_image
from cxx_image_io import ImageMetadata
import numpy as np
from pathlib import Path
image, metadata = read_image(Path('test/images/RAW_CANON_EOS_1DX.CR2'))
assert isinstance(image, np.ndarray)
print('Type:', image.dtype)
print('Shape:', image.shape)
print(metadata)
~~~~~~~~~~~~~~~
The print result will be like:
~~~~~~~~~~~~~~{.sh}
Type: uint16
Shape: (3584, 5344)
{
"fileInfo":{
"width":5344,
"height":3584,
"pixelPrecision":14,
"imageLayout":"planar",
"pixelType":"bayer_rggb",
"pixelRepresentation":"uint16"
},
"exifMetadata":{
"imageWidth":5218,
"imageHeight":3482,
"make":"Canon",
"model":"EOS-1D X",
"orientation":1,
"exposureTime":[
1,
80
],
"fNumber":[
56,
10
],
"isoSpeedRatings":1600,
"dateTimeOriginal":"2012:09:06 07:48:25",
"focalLength":[
700,
10
]
},
"shootingParams":{
},
"cameraControls":{
"whiteBalance":[
1.75390625,
1.4775390625
]
},
"calibrationData":{
"blackLevel":2048,
"whiteLevel":15438,
"colorMatrix":[
[
1.9404515027999878,
-1.1166307926177979,
0.17617927491664886
],
[
-0.21374493837356567,
1.6440128087997437,
-0.430267870426178
],
[
0.021280933171510696,
-0.5217925906181335,
1.500511646270752
]
]
},
"semanticMasks":[
],
"LibRawParams":{
"rawWitdh":5344,
"rawHeight":3584,
"rawWidthVisible":5218,
"rawWidthVisible":3482,
"topMargin":100,
"leftMargin":126
}
}
~~~~~~~~~~~~~~~
Note that `camera manufacturer RAW image metadata` has an additional Parameters: `LibRawParams`, it contains the coordinates of the original RAW sizes, including the top and left margins, as well as the actual visible area's width and height in the original RAW.
According to these inforamtions, user can corp the visable zone on the RAW image numpy array.
## Image reading with sidecar JSON
Some file formats need to know in advance some informations about the image.
For example, the PLAIN RAW format is just a simple dump of a buffer into a file, thus it needs to know how to interpret the data.
Bayer Plain Raw 16 bits
~~~~~~~~~~~~~~~{.python}
image, metadata = read_image(Path('/path/to/image.plain16'))
print('Type:', image.dtype)
print('Shape:', image.shape)
print(metadata.fileInfo)
~~~~~~~~~~~~~~~
In this case, user need to have an image sidecar JSON located next to the image file as the same name and path `'/path/to/image.json'`
~~~~~~~~~~~~~~~{.json}
{
"fileInfo": {
"format": "plain",
"height": 3072,
"width": 4080
"pixelPrecision": 16,
"pixelType": "bayer_gbrg",
}
}
~~~~~~~~~~~~~~~
After image reading, the information in JSON sidecar is parsed in `ImageMetadata` object.
The print result of will be like this:
~~~~~~~~~~~~~~~{.sh}
Type: uint16
Shape: (3072, 4080)
~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~{.sh}
{'width': 4080, 'height': 3072, 'pixelPrecision': 16, 'imageLayout': 'planar', 'pixelType': 'bayer_gbrg'}
~~~~~~~~~~~~~~~
`metadata.fileInfo` shows that `image` is a 2-dimensional numpy array, where pixel is Bayer type, planar layout (not interleaved), pixel depth is 16 bits.
`metadata.fileInfo` has more attributes to describe the file info, like `widthAlignment`, `heightAlignment`, please use `help(metadata.fileInfo)` to see the details.
Image sidecar is not mandatory, for the other formats which have already image information in their header, like jpg, png, tif, cfa. we don't need to provide image metadata.
### Other image reading with sidecar examples
<details>
<summary>
Click to unfold other image format sidecar examples
</summary>
#### Packed RAW MIPI 12 bits:
python code
~~~~~~~~~~~~~~~{.python}
image, metadata = read_image(Path('/path/to/image.RAWMIPI12'))
~~~~~~~~~~~~~~~
sidecar json
~~~~~~~~~~~~~~~{.json}
{
"fileInfo": {
"fileFormat": "raw12",
"height": 3000,
"width": 4000,
"pixelPrecision": 12,
"pixelType": "bayer_gbrg"
}
}
~~~~~~~~~~~~~~~
#### Packed RAW MIPI 10 bits:
python code
~~~~~~~~~~~~~~~{.python}
image, metadata = read_image(Path('/path/to/image.RAWMIPI'))
~~~~~~~~~~~~~~~
sidecar json
~~~~~~~~~~~~~~~{.json}
{
"fileInfo": {
"height": 3000,
"width": 4000,
"format": "raw10",
"pixelPrecision": 10,
"pixelType": "bayer_grbg"
}
}
~~~~~~~~~~~~~~~
#### YUV 420 buffer 8 bits:
python code
~~~~~~~~~~~~~~~{.python}
image, metadata = read_image(Path('/path/to/image.yuv'))
~~~~~~~~~~~~~~~
sidecar json
~~~~~~~~~~~~~~~{.json}
{
"fileInfo": {
"format": "plain",
"height": 300,
"width": 400,
"imageLayout": "yuv_420"
}
}
~~~~~~~~~~~~~~~
#### NV12 buffer 8 bits:
python code
~~~~~~~~~~~~~~~{.python}
image, metadata = read_image(Path('/path/to/image.nv12'))
~~~~~~~~~~~~~~~
sidecar json
~~~~~~~~~~~~~~~{.json}
{
"fileInfo": {
"format": "plain",
"height": 300,
"width": 400,
"imageLayout": "nv12"
}
}
~~~~~~~~~~~~~~~
</details>
## Split and merge image channels
After calling `read_image`, `cxx-image-io` provides a public API `split_image_channels` which helps to split to different colors channels, so that user can do the different processes on them. The function return type is a dictionary which contains the different color channel name as keys, and the value in numpy array of one single channel.
before calling `write_image`, `cxx-image-io` provides a public API `merge_image_channels` which helps to merge different colors channels to a numpy array buffer.
~~~~~~~~~~~~~~~{.python}
from cxx_image_io import read_image, split_image_channels, merge_image_channels, ImageLayout, ImageMetadata, PixelRepresentation, PixelType
import numpy as np
from pathlib import Path
rgb, metadata = read_image(Path('rgb_8bit.jpg'))
channels = split_image_channels(rgb, metadata)
# print(channels['r']) # Red channel in numpy array
# print(channels['g']) # Green channel in numpy array
# print(channels['b']) # Blue channel in numpy array
rgb_post = merge_image_channels(channels, metadata)
np.array_equal(rgb, rgb_post)
cfa, metadata = read_image(Path('bayer_16bit.plain16'))
channels = split_image_channels(cfa, metadata)
# print(channels['gr']) # Bayer Gr pixels in numpy array
# print(channels['r']) # Bayer R pixels in numpy array
# print(channels['b']) # Bayer B pixels in numpy array
# print(channels['gb']) # Bayer Gb pixels in numpy array
cfa_post = merge_image_channels(channels, metadata)
np.array_equal(cfa, cfa_post)
yuv, metadata = read_image(Path('raw.nv12'))
channels = split_image_channels(yuv, metadata)
# print(channels['y']) # Y plane in numpy array
# print(channels['u']) # U plane in numpy array
# print(channels['v']) # V plane in numpy array
yuv_post = merge_image_channels(channels, metadata)
np.array_equal(yuv, yuv_post)
~~~~~~~~~~~~~~~
## Image writing
`write_image` is able to write a numpy array to image file.
To write the pure numpy array to different image file extensions.
User need to define the following fundamental parameters in ImageMetadata which is part of ImageWriter.Options.
In order to call the specific C++ image libraries with them.
~~~~~~~~~~~~~~~{.python}
from cxx_image_io import ImageMetadata, ImageWriter, FileFormat, PixelType, ImageLayout
from cxx_image_io import write_image
import numpy as np
from pathlib import Path
metadata = ImageMetadata()
metadata.fileInfo.pixelType = PixelType.RGB
metadata.fileInfo.imageLayout = ImageLayout.INTERLEAVED
write_options = ImageWriter.Options(metadata)
assert isinstance(image, np.ndarray)
write_image(Path('/path/to/image.jpg'), image, write_options)
~~~~~~~~~~~~~~~
`write_image` can determine the image format by file extensions, but some formats don't not rely on a specific extension, for example the PLAIN format that allows to directly dump the image buffer to a file. In this case, the format can be specified through ImageWriter.Options.
~~~~~~~~~~~~~~~{.python}
metadata = ImageMetadata()
metadata.fileInfo.pixelType = PixelType.BAYER_GBRG
metadata.fileInfo.imageLayout = ImageLayout.PLANAR
write_options = ImageWriter.Options(metadata)
write_options.fileFormat = FileFormat.PLAIN
assert isinstance(image, np.ndarray)
write_image(Path('/path/to/image.plain16'), image, write_options)
~~~~~~~~~~~~~~~
### Other image writing examples
<details>
<summary>
Click to unfold other image writing examples
</summary>
#### Packed RAW MIPI 12 bits:
~~~~~~~~~~~~~~~{.python}
metadata = ImageMetadata()
metadata.fileInfo.pixelType = PixelType.BAYER_GBRG # adapt with User's RAW Bayer pattern.
metadata.fileInfo.imageLayout = ImageLayout.PLANAR
metadata.fileInfo.pixelPrecision = 12
write_options = ImageWriter.Options(metadata)
assert isinstance(image, np.ndarray)
write_image(Path('/path/to/image.RAWMIPI12'), image, write_options)
~~~~~~~~~~~~~~~
#### Packed RAW MIPI 10 bits:
~~~~~~~~~~~~~~~{.python}
metadata = ImageMetadata()
metadata.fileInfo.pixelType = PixelType.BAYER_GBRG # to adapt with User's RAW Bayer pattern.
metadata.fileInfo.imageLayout = ImageLayout.PLANAR
metadata.fileInfo.pixelPrecision = 10
write_options = ImageWriter.Options(metadata)
assert isinstance(image, np.ndarray)
write_image(Path('/path/to/image.RAWMIPI10'), image, write_options)
~~~~~~~~~~~~~~~
#### YUV 420 buffer 8 bits:
~~~~~~~~~~~~~~~{.python}
metadata = ImageMetadata()
metadata.fileInfo.pixelType = PixelType.YUV
metadata.fileInfo.imageLayout = ImageLayout.YUV_420
write_options = ImageWriter.Options(metadata)
write_options.fileFormat = FileFormat.PLAIN
assert isinstance(image, np.ndarray)
write_image(Path('/path/to/image.yuv'), image, write_options)
~~~~~~~~~~~~~~~
#### NV12 buffer 8 bits:
~~~~~~~~~~~~~~~{.python}
metadata = ImageMetadata()
metadata.fileInfo.pixelType = PixelType.YUV
metadata.fileInfo.imageLayout = ImageLayout.NV12
write_options = ImageWriter.Options(metadata)
write_options.fileFormat = FileFormat.PLAIN
assert isinstance(image, np.ndarray)
write_image(Path('/path/to/image.nv12'), image, write_options)
~~~~~~~~~~~~~~~
#### Bayer dng 12 bits:
~~~~~~~~~~~~~~~{.python}
metadata = ImageMetadata()
metadata.fileInfo.pixelType = PixelType.BAYER_RGGB # adapt with User's RAW Bayer pattern.
metadata.fileInfo.imageLayout = ImageLayout.PLANAR
metadata.fileInfo.pixelPrecision = 12
write_options = ImageWriter.Options(metadata)
assert isinstance(image, np.ndarray)
write_image(Path('/path/to/image.dng'), image, write_options)
~~~~~~~~~~~~~~~
#### RGB 8 bits images (jpg, png, tif, bmp):
~~~~~~~~~~~~~~~{.python}
metadata = ImageMetadata()
metadata.fileInfo.pixelType = PixelType.RGB
metadata.fileInfo.imageLayout = ImageLayout.INTERLEAVED
write_options = ImageWriter.Options(metadata)
assert isinstance(image, np.ndarray)
write_image(Path('/path/to/image.jpg'), image, write_options)
~~~~~~~~~~~~~~~
#### CFA 16 bits image:
~~~~~~~~~~~~~~~{.python}
metadata = ImageMetadata()
metadata.fileInfo.pixelType = PixelType.BAYER_RGGB # adapt with User's RAW Bayer pattern.
metadata.fileInfo.imageLayout = ImageLayout.PLANAR
metadata.fileInfo.pixelPrecision = 16
write_options = ImageWriter.Options(metadata)
assert isinstance(image, np.ndarray)
write_image(Path('/path/to/image.cfa'), image, write_options)
~~~~~~~~~~~~~~~
#### Grayscale 16 bits png image:
~~~~~~~~~~~~~~~{.python}
metadata = ImageMetadata()
metadata.fileInfo.pixelType = PixelType.GRAYSCALE
metadata.fileInfo.imageLayout = ImageLayout.PLANAR
metadata.fileInfo.pixelPrecision = 16
write_options = ImageWriter.Options(metadata)
assert isinstance(image, np.ndarray)
write_image(Path('/path/to/image.png'), image, write_options)
~~~~~~~~~~~~~~~
#### Bayer 16 bits tif image:
~~~~~~~~~~~~~~~{.python}
metadata = ImageMetadata()
metadata.fileInfo.pixelType = PixelType.BAYER_RGGB # adapt with User's RAW Bayer pattern.
metadata.fileInfo.imageLayout = ImageLayout.PLANAR
metadata.fileInfo.pixelPrecision = 16
write_options = ImageWriter.Options(metadata)
assert isinstance(image, np.ndarray)
write_image(Path('/path/to/image.tif'), image, write_options)
~~~~~~~~~~~~~~~
</details>
## EXIF
Some image formats, like JPEG and TIFF, support EXIF reading and writing.
If supported, EXIF can be read by calling `read_exif` and be written by calling `write_exif`.
~~~~~~~~~~~~~~~{.python}
from cxx_image_io import read_exif, write_exif
from pathlib import Path
exif = read_exif(Path('/path/to/image.jpg'))
print(exif)
write_exif(Path('path/to/new_image.jpg'), exif)
~~~~~~~~~~~~~~~
`print(exif)` will give the following output like:
~~~~~~~~~~~~~~~{.sh}
{
'make': 'Canon',
'model': 'Canon EOS 40D',
'orientation': 1,
'software': 'GIMP 2.4.5',
'exposureTime': [1, 160],
'fNumber': [71, 10],
'isoSpeedRatings': 100,
'dateTimeOriginal': '2008:05:30 15:56:01',
'exposureBiasValue': [0, 1],
'focalLength': [135, 1]
}
~~~~~~~~~~~~~~~
user can use `help(exif)` to see the definition of `ExifMetdata`.
EXIF metadata can be read and written along with an image by specifying them in the ImageMetadata. In this case, the EXIF wil be read and written when calling `read_image` and `write_image`.
~~~~~~~~~~~~~~~{.python}
image, metadata = read_image(Path('/path/to/image.jpg'))
metadata.exifMetadata.make = 'Custom'
write_options = ImageWriter.Options(metadata)
write_image(Path('/path/to/image.jpg'), image, write_options)
~~~~~~~~~~~~~~~
# Dependencies
This project has the dependencies of the following libraries by cmake FetchContent:
## Statically linked
- libjpeg: https://libjpeg.sourceforge.net/
- libpng: http://www.libpng.org/pub/png/libpng.html
- libtiff: https://libtiff.gitlab.io/libtiff/
- adobe dng sdk: https://helpx.adobe.com/camera-raw/digital-negative.html
- pybind11 (BSD-2): https://github.com/pybind/pybind11
- cxx-image (Apache 2.0): https://github.com/emmcb/cxx-image
## Dynamically linked
- libexif (LGPL v2.1): https://libexif.github.io/
- libraw (LGPL v2.1 and CDDL): https://www.libraw.org/
# License
This project is licensed under the MIT License - see the [LICENSE.md](https://github.com/sygslhy/image-io/blob/main/LICENSE.md) file for details.
Raw data
{
"_id": null,
"home_page": null,
"name": "cxx-image-io",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": "Yuan SUN <sunyuan860510@gmail.com>",
"keywords": "imageio, image-io, numpy-image, exif, bmp, camera raw image, raw io, dng io, tif, yuv io, nv12 io, canon, nikon, leica, sony, pentax, kodak",
"author": null,
"author_email": "Yuan SUN <sunyuan860510@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/84/1c/18cca05bb6bec61e11244924ed1a639a3d3514c075b893aaff236c4c9cf6/cxx_image_io-1.1.1.tar.gz",
"platform": null,
"description": "# CXX Image IO\n\n\n\n\n\n[](https://github.com/sygslhy/image-io/blob/main/LICENSE.md)\n\n[](https://github.com/sygslhy/image-io/actions/workflows/wheels.yml)\n[](https://github.com/sygslhy/image-io/actions/workflows/schedule.yml)\n\n\n# What's new since `v1.1.1`\n\nSince version `v1.1.1`, `cxx-image-io` supports reading Bayer RAW images from reflex cameras into numpy.array, while also parsing some EXIF information. It is integrated with the C++ library .\n\nThe RAW image formats of the following camera manufacturers are supported, user can open these camera raw files by `read_image`, get image as `numpy.array` format:\n\n| Camera manufacturer | Image format |\n|---------------------|--------------|\n| Canon | CR2 |\n| Nikon | NEF |\n| Sony | ARW |\n| Panasonic | RW2 |\n| Kodak | DCR |\n| Samsung | SRW |\n| Olympus | ORF |\n| Leica | RAW |\n| Pentax | PEF |\n\n# Introduction\n\nCXX Image IO is a Python project which provides the image IO interfaces, binding with the C++ library: https://github.com/emmcb/cxx-image.\nThese IO interfaces are designed to read and write images in many file formats in generic way and to interact nicely with numpy array.\n\n| Image format | Read | Write | EXIF | Pixel precision | Pixel type | File extension | Sidecar needed |\n|---------------|------|--------|------|------------------------|----------------------|----------------------------------|------------------|\n| BMP | x | x | | 8 bits | Grayscale, RGB, RGBA | .bmp | |\n| CFA | x | x | | 16 bits | Bayer | .cfa | |\n| DNG | x | x | x | 16 bits, float | Bayer, RGB | .dng | |\n| JPEG | x | x | x | 8 bits | Grayscale, RGB | .jpg, .jpeg | |\n| MIPI RAW | x | x | | 10 bits, 12 bits | Bayer | .RAWMIPI, .RAWMIPI10, .RAWMIPI12 | x |\n| PLAIN RAW | x | x | | * | * | .raw .plain16, .nv12, .yuv, * | x |\n| PNG | x | x | | 8 bits, 16 bits | Grayscale, RGB, RGBA | .png | |\n| TIFF | x | x | x | 8 bits, 16 bits, float | Bayer, RGB | .tif, .tiff | |\n\n\n\n# Getting Started\n\n## Prerequisites\n\nThis projet currently supports Python from `3.9` to `3.13` on\n- Windows: `x86_64`\n- Linux: `x86_64` and `aarch64`, glibc `v2.28+`, musl libc `v1.2+`\n- MacOS: `x86_64` and `arm64`, `v11.0+`\n\n## Installation\n\nThe python package `cxx-image-io` is to be installed by `pip`\n\n```sh\npip install cxx-image-io\n```\n\n# Usage\n\n## Image reading basic example\n\n`read_image` is able to read a image file and return a numpy array and ImageMetadata object.\n\n~~~~~~~~~~~~~~~{.python}\nfrom cxx_image_io import read_image\nfrom cxx_image_io import ImageMetadata\nimport numpy as np\nfrom pathlib import Path\n\nimage, metadata = read_image(Path('/path/to/image.jpg'))\nassert isinstance(image, np.ndarray)\n\nprint('Type:', image.dtype)\nprint('Shape:', image.shape)\n~~~~~~~~~~~~~~~\n\nimage is a numpy array which is suitable for the image processing afterwards.\n\nThe print result could be like this:\n~~~~~~~~~~~~~~~{.sh}\nType: uint8\nShape: (551, 603, 3)\n~~~~~~~~~~~~~~~\n\n`ImageMetadata` is the information about the image, the component `fileInfo` including the pixel type, pixel precision and image layout, which define fundamentally how the pixels arranged in buffer.\n\n\n~~~~~~~~~~~~~~~{.python}\nprint(metadata.fileInfo)\n~~~~~~~~~~~~~~~\n\nThe print result could be like this:\n~~~~~~~~~~~~~~~{.sh}\n{'pixelPrecision': 8, 'imageLayout': 'interleaved', 'pixelType': 'rgb'}\n~~~~~~~~~~~~~~~\n\n`metadata.fileInfo` shows: `image` is a 3-dimensional numpy array, where rgb 3 channels interleaved, in each channel, pixel depth is 8 bits.\n\n`ImageMetadata` has more components than `fileInfo`, it also includes `ExifMetadata`, `help(ImageMetadata)` will show the details.\n\n\n### Read Camera manufacturer RAW image example:\n\nreading camera manufacturer raw image is the same method as we read from .jpg or .tif, just call `read_image`.\n\n~~~~~~~~~~~~~~~{.python}\nfrom cxx_image_io import read_image\nfrom cxx_image_io import ImageMetadata\nimport numpy as np\nfrom pathlib import Path\n\nimage, metadata = read_image(Path('test/images/RAW_CANON_EOS_1DX.CR2'))\nassert isinstance(image, np.ndarray)\n\nprint('Type:', image.dtype)\nprint('Shape:', image.shape)\n\nprint(metadata)\n~~~~~~~~~~~~~~~\n\n\nThe print result will be like:\n~~~~~~~~~~~~~~{.sh}\nType: uint16\nShape: (3584, 5344)\n{\n \"fileInfo\":{\n \"width\":5344,\n \"height\":3584,\n \"pixelPrecision\":14,\n \"imageLayout\":\"planar\",\n \"pixelType\":\"bayer_rggb\",\n \"pixelRepresentation\":\"uint16\"\n },\n \"exifMetadata\":{\n \"imageWidth\":5218,\n \"imageHeight\":3482,\n \"make\":\"Canon\",\n \"model\":\"EOS-1D X\",\n \"orientation\":1,\n \"exposureTime\":[\n 1,\n 80\n ],\n \"fNumber\":[\n 56,\n 10\n ],\n \"isoSpeedRatings\":1600,\n \"dateTimeOriginal\":\"2012:09:06 07:48:25\",\n \"focalLength\":[\n 700,\n 10\n ]\n },\n \"shootingParams\":{\n\n },\n \"cameraControls\":{\n \"whiteBalance\":[\n 1.75390625,\n 1.4775390625\n ]\n },\n \"calibrationData\":{\n \"blackLevel\":2048,\n \"whiteLevel\":15438,\n \"colorMatrix\":[\n [\n 1.9404515027999878,\n -1.1166307926177979,\n 0.17617927491664886\n ],\n [\n -0.21374493837356567,\n 1.6440128087997437,\n -0.430267870426178\n ],\n [\n 0.021280933171510696,\n -0.5217925906181335,\n 1.500511646270752\n ]\n ]\n },\n \"semanticMasks\":[\n\n ],\n \"LibRawParams\":{\n \"rawWitdh\":5344,\n \"rawHeight\":3584,\n \"rawWidthVisible\":5218,\n \"rawWidthVisible\":3482,\n \"topMargin\":100,\n \"leftMargin\":126\n }\n}\n~~~~~~~~~~~~~~~\n\nNote that `camera manufacturer RAW image metadata` has an additional Parameters: `LibRawParams`, it contains the coordinates of the original RAW sizes, including the top and left margins, as well as the actual visible area's width and height in the original RAW.\n\nAccording to these inforamtions, user can corp the visable zone on the RAW image numpy array.\n\n## Image reading with sidecar JSON\n\nSome file formats need to know in advance some informations about the image.\nFor example, the PLAIN RAW format is just a simple dump of a buffer into a file, thus it needs to know how to interpret the data.\n\nBayer Plain Raw 16 bits\n~~~~~~~~~~~~~~~{.python}\nimage, metadata = read_image(Path('/path/to/image.plain16'))\nprint('Type:', image.dtype)\nprint('Shape:', image.shape)\nprint(metadata.fileInfo)\n~~~~~~~~~~~~~~~\n\nIn this case, user need to have an image sidecar JSON located next to the image file as the same name and path `'/path/to/image.json'`\n\n~~~~~~~~~~~~~~~{.json}\n{\n \"fileInfo\": {\n \"format\": \"plain\",\n \"height\": 3072,\n \"width\": 4080\n \"pixelPrecision\": 16,\n \"pixelType\": \"bayer_gbrg\",\n }\n}\n~~~~~~~~~~~~~~~\n\n\nAfter image reading, the information in JSON sidecar is parsed in `ImageMetadata` object.\n\nThe print result of will be like this:\n~~~~~~~~~~~~~~~{.sh}\nType: uint16\nShape: (3072, 4080)\n~~~~~~~~~~~~~~~\n\n~~~~~~~~~~~~~~~{.sh}\n{'width': 4080, 'height': 3072, 'pixelPrecision': 16, 'imageLayout': 'planar', 'pixelType': 'bayer_gbrg'}\n~~~~~~~~~~~~~~~\n\n`metadata.fileInfo` shows that `image` is a 2-dimensional numpy array, where pixel is Bayer type, planar layout (not interleaved), pixel depth is 16 bits.\n\n`metadata.fileInfo` has more attributes to describe the file info, like `widthAlignment`, `heightAlignment`, please use `help(metadata.fileInfo)` to see the details.\n\nImage sidecar is not mandatory, for the other formats which have already image information in their header, like jpg, png, tif, cfa. we don't need to provide image metadata.\n\n### Other image reading with sidecar examples\n\n<details>\n <summary>\n Click to unfold other image format sidecar examples\n </summary>\n\n#### Packed RAW MIPI 12 bits:\npython code\n~~~~~~~~~~~~~~~{.python}\nimage, metadata = read_image(Path('/path/to/image.RAWMIPI12'))\n~~~~~~~~~~~~~~~\n\nsidecar json\n~~~~~~~~~~~~~~~{.json}\n{\n \"fileInfo\": {\n \"fileFormat\": \"raw12\",\n \"height\": 3000,\n \"width\": 4000,\n \"pixelPrecision\": 12,\n \"pixelType\": \"bayer_gbrg\"\n }\n}\n~~~~~~~~~~~~~~~\n\n#### Packed RAW MIPI 10 bits:\npython code\n~~~~~~~~~~~~~~~{.python}\nimage, metadata = read_image(Path('/path/to/image.RAWMIPI'))\n~~~~~~~~~~~~~~~\n\nsidecar json\n~~~~~~~~~~~~~~~{.json}\n{\n \"fileInfo\": {\n \"height\": 3000,\n \"width\": 4000,\n \"format\": \"raw10\",\n \"pixelPrecision\": 10,\n \"pixelType\": \"bayer_grbg\"\n }\n}\n~~~~~~~~~~~~~~~\n\n#### YUV 420 buffer 8 bits:\npython code\n~~~~~~~~~~~~~~~{.python}\nimage, metadata = read_image(Path('/path/to/image.yuv'))\n~~~~~~~~~~~~~~~\n\nsidecar json\n~~~~~~~~~~~~~~~{.json}\n{\n \"fileInfo\": {\n \"format\": \"plain\",\n \"height\": 300,\n \"width\": 400,\n \"imageLayout\": \"yuv_420\"\n }\n}\n~~~~~~~~~~~~~~~\n\n#### NV12 buffer 8 bits:\npython code\n~~~~~~~~~~~~~~~{.python}\nimage, metadata = read_image(Path('/path/to/image.nv12'))\n~~~~~~~~~~~~~~~\n\nsidecar json\n~~~~~~~~~~~~~~~{.json}\n{\n \"fileInfo\": {\n \"format\": \"plain\",\n \"height\": 300,\n \"width\": 400,\n \"imageLayout\": \"nv12\"\n }\n}\n~~~~~~~~~~~~~~~\n\n\n</details>\n\n\n## Split and merge image channels\nAfter calling `read_image`, `cxx-image-io` provides a public API `split_image_channels` which helps to split to different colors channels, so that user can do the different processes on them. The function return type is a dictionary which contains the different color channel name as keys, and the value in numpy array of one single channel.\n\nbefore calling `write_image`, `cxx-image-io` provides a public API `merge_image_channels` which helps to merge different colors channels to a numpy array buffer.\n\n~~~~~~~~~~~~~~~{.python}\nfrom cxx_image_io import read_image, split_image_channels, merge_image_channels, ImageLayout, ImageMetadata, PixelRepresentation, PixelType\nimport numpy as np\nfrom pathlib import Path\n\nrgb, metadata = read_image(Path('rgb_8bit.jpg'))\n\nchannels = split_image_channels(rgb, metadata)\n\n# print(channels['r']) # Red channel in numpy array\n# print(channels['g']) # Green channel in numpy array\n# print(channels['b']) # Blue channel in numpy array\n\nrgb_post = merge_image_channels(channels, metadata)\n\nnp.array_equal(rgb, rgb_post)\n\ncfa, metadata = read_image(Path('bayer_16bit.plain16'))\n\nchannels = split_image_channels(cfa, metadata)\n\n# print(channels['gr']) # Bayer Gr pixels in numpy array\n# print(channels['r']) # Bayer R pixels in numpy array\n# print(channels['b']) # Bayer B pixels in numpy array\n# print(channels['gb']) # Bayer Gb pixels in numpy array\n\ncfa_post = merge_image_channels(channels, metadata)\n\nnp.array_equal(cfa, cfa_post)\n\nyuv, metadata = read_image(Path('raw.nv12'))\n\nchannels = split_image_channels(yuv, metadata)\n\n# print(channels['y']) # Y plane in numpy array\n# print(channels['u']) # U plane in numpy array\n# print(channels['v']) # V plane in numpy array\n\nyuv_post = merge_image_channels(channels, metadata)\n\nnp.array_equal(yuv, yuv_post)\n\n~~~~~~~~~~~~~~~\n\n\n## Image writing\n\n`write_image` is able to write a numpy array to image file.\n\nTo write the pure numpy array to different image file extensions.\nUser need to define the following fundamental parameters in ImageMetadata which is part of ImageWriter.Options.\nIn order to call the specific C++ image libraries with them.\n\n~~~~~~~~~~~~~~~{.python}\nfrom cxx_image_io import ImageMetadata, ImageWriter, FileFormat, PixelType, ImageLayout\nfrom cxx_image_io import write_image\nimport numpy as np\nfrom pathlib import Path\n\nmetadata = ImageMetadata()\nmetadata.fileInfo.pixelType = PixelType.RGB\nmetadata.fileInfo.imageLayout = ImageLayout.INTERLEAVED\n\nwrite_options = ImageWriter.Options(metadata)\n\nassert isinstance(image, np.ndarray)\nwrite_image(Path('/path/to/image.jpg'), image, write_options)\n~~~~~~~~~~~~~~~\n\n`write_image` can determine the image format by file extensions, but some formats don't not rely on a specific extension, for example the PLAIN format that allows to directly dump the image buffer to a file. In this case, the format can be specified through ImageWriter.Options.\n\n~~~~~~~~~~~~~~~{.python}\nmetadata = ImageMetadata()\nmetadata.fileInfo.pixelType = PixelType.BAYER_GBRG\nmetadata.fileInfo.imageLayout = ImageLayout.PLANAR\n\nwrite_options = ImageWriter.Options(metadata)\nwrite_options.fileFormat = FileFormat.PLAIN\n\nassert isinstance(image, np.ndarray)\nwrite_image(Path('/path/to/image.plain16'), image, write_options)\n~~~~~~~~~~~~~~~\n\n\n### Other image writing examples\n<details>\n <summary>\n Click to unfold other image writing examples\n </summary>\n\n#### Packed RAW MIPI 12 bits:\n~~~~~~~~~~~~~~~{.python}\nmetadata = ImageMetadata()\n\nmetadata.fileInfo.pixelType = PixelType.BAYER_GBRG # adapt with User's RAW Bayer pattern.\nmetadata.fileInfo.imageLayout = ImageLayout.PLANAR\nmetadata.fileInfo.pixelPrecision = 12\n\nwrite_options = ImageWriter.Options(metadata)\n\nassert isinstance(image, np.ndarray)\nwrite_image(Path('/path/to/image.RAWMIPI12'), image, write_options)\n~~~~~~~~~~~~~~~\n\n\n#### Packed RAW MIPI 10 bits:\n~~~~~~~~~~~~~~~{.python}\nmetadata = ImageMetadata()\n\nmetadata.fileInfo.pixelType = PixelType.BAYER_GBRG # to adapt with User's RAW Bayer pattern.\nmetadata.fileInfo.imageLayout = ImageLayout.PLANAR\nmetadata.fileInfo.pixelPrecision = 10\n\nwrite_options = ImageWriter.Options(metadata)\n\nassert isinstance(image, np.ndarray)\nwrite_image(Path('/path/to/image.RAWMIPI10'), image, write_options)\n~~~~~~~~~~~~~~~\n\n\n#### YUV 420 buffer 8 bits:\n~~~~~~~~~~~~~~~{.python}\nmetadata = ImageMetadata()\n\nmetadata.fileInfo.pixelType = PixelType.YUV\nmetadata.fileInfo.imageLayout = ImageLayout.YUV_420\n\nwrite_options = ImageWriter.Options(metadata)\nwrite_options.fileFormat = FileFormat.PLAIN\n\nassert isinstance(image, np.ndarray)\nwrite_image(Path('/path/to/image.yuv'), image, write_options)\n\n~~~~~~~~~~~~~~~\n\n#### NV12 buffer 8 bits:\n~~~~~~~~~~~~~~~{.python}\nmetadata = ImageMetadata()\n\nmetadata.fileInfo.pixelType = PixelType.YUV\nmetadata.fileInfo.imageLayout = ImageLayout.NV12\n\nwrite_options = ImageWriter.Options(metadata)\nwrite_options.fileFormat = FileFormat.PLAIN\n\nassert isinstance(image, np.ndarray)\nwrite_image(Path('/path/to/image.nv12'), image, write_options)\n~~~~~~~~~~~~~~~\n\n#### Bayer dng 12 bits:\n~~~~~~~~~~~~~~~{.python}\nmetadata = ImageMetadata()\n\nmetadata.fileInfo.pixelType = PixelType.BAYER_RGGB # adapt with User's RAW Bayer pattern.\nmetadata.fileInfo.imageLayout = ImageLayout.PLANAR\nmetadata.fileInfo.pixelPrecision = 12\n\nwrite_options = ImageWriter.Options(metadata)\n\nassert isinstance(image, np.ndarray)\nwrite_image(Path('/path/to/image.dng'), image, write_options)\n~~~~~~~~~~~~~~~\n\n#### RGB 8 bits images (jpg, png, tif, bmp):\n~~~~~~~~~~~~~~~{.python}\nmetadata = ImageMetadata()\n\nmetadata.fileInfo.pixelType = PixelType.RGB\nmetadata.fileInfo.imageLayout = ImageLayout.INTERLEAVED\n\nwrite_options = ImageWriter.Options(metadata)\n\nassert isinstance(image, np.ndarray)\nwrite_image(Path('/path/to/image.jpg'), image, write_options)\n~~~~~~~~~~~~~~~\n\n#### CFA 16 bits image:\n~~~~~~~~~~~~~~~{.python}\nmetadata = ImageMetadata()\n\nmetadata.fileInfo.pixelType = PixelType.BAYER_RGGB # adapt with User's RAW Bayer pattern.\nmetadata.fileInfo.imageLayout = ImageLayout.PLANAR\nmetadata.fileInfo.pixelPrecision = 16\n\nwrite_options = ImageWriter.Options(metadata)\n\nassert isinstance(image, np.ndarray)\nwrite_image(Path('/path/to/image.cfa'), image, write_options)\n~~~~~~~~~~~~~~~\n\n#### Grayscale 16 bits png image:\n~~~~~~~~~~~~~~~{.python}\nmetadata = ImageMetadata()\n\nmetadata.fileInfo.pixelType = PixelType.GRAYSCALE\nmetadata.fileInfo.imageLayout = ImageLayout.PLANAR\nmetadata.fileInfo.pixelPrecision = 16\n\nwrite_options = ImageWriter.Options(metadata)\n\nassert isinstance(image, np.ndarray)\nwrite_image(Path('/path/to/image.png'), image, write_options)\n~~~~~~~~~~~~~~~\n\n#### Bayer 16 bits tif image:\n~~~~~~~~~~~~~~~{.python}\nmetadata = ImageMetadata()\n\nmetadata.fileInfo.pixelType = PixelType.BAYER_RGGB # adapt with User's RAW Bayer pattern.\nmetadata.fileInfo.imageLayout = ImageLayout.PLANAR\nmetadata.fileInfo.pixelPrecision = 16\n\nwrite_options = ImageWriter.Options(metadata)\n\nassert isinstance(image, np.ndarray)\nwrite_image(Path('/path/to/image.tif'), image, write_options)\n~~~~~~~~~~~~~~~\n\n\n</details>\n\n\n## EXIF\n\nSome image formats, like JPEG and TIFF, support EXIF reading and writing.\n\nIf supported, EXIF can be read by calling `read_exif` and be written by calling `write_exif`.\n\n~~~~~~~~~~~~~~~{.python}\nfrom cxx_image_io import read_exif, write_exif\nfrom pathlib import Path\n\nexif = read_exif(Path('/path/to/image.jpg'))\n\nprint(exif)\n\nwrite_exif(Path('path/to/new_image.jpg'), exif)\n~~~~~~~~~~~~~~~\n\n`print(exif)` will give the following output like:\n~~~~~~~~~~~~~~~{.sh}\n{\n 'make': 'Canon',\n 'model': 'Canon EOS 40D',\n 'orientation': 1,\n 'software': 'GIMP 2.4.5',\n 'exposureTime': [1, 160],\n 'fNumber': [71, 10],\n 'isoSpeedRatings': 100,\n 'dateTimeOriginal': '2008:05:30 15:56:01',\n 'exposureBiasValue': [0, 1],\n 'focalLength': [135, 1]\n}\n~~~~~~~~~~~~~~~\nuser can use `help(exif)` to see the definition of `ExifMetdata`.\n\nEXIF metadata can be read and written along with an image by specifying them in the ImageMetadata. In this case, the EXIF wil be read and written when calling `read_image` and `write_image`.\n\n~~~~~~~~~~~~~~~{.python}\nimage, metadata = read_image(Path('/path/to/image.jpg'))\nmetadata.exifMetadata.make = 'Custom'\nwrite_options = ImageWriter.Options(metadata)\nwrite_image(Path('/path/to/image.jpg'), image, write_options)\n~~~~~~~~~~~~~~~\n\n# Dependencies\n\nThis project has the dependencies of the following libraries by cmake FetchContent:\n\n## Statically linked\n- libjpeg: https://libjpeg.sourceforge.net/\n- libpng: http://www.libpng.org/pub/png/libpng.html\n- libtiff: https://libtiff.gitlab.io/libtiff/\n- adobe dng sdk: https://helpx.adobe.com/camera-raw/digital-negative.html\n- pybind11 (BSD-2): https://github.com/pybind/pybind11\n- cxx-image (Apache 2.0): https://github.com/emmcb/cxx-image\n\n## Dynamically linked\n- libexif (LGPL v2.1): https://libexif.github.io/\n- libraw (LGPL v2.1 and CDDL): https://www.libraw.org/\n\n\n# License\n\nThis project is licensed under the MIT License - see the [LICENSE.md](https://github.com/sygslhy/image-io/blob/main/LICENSE.md) file for details.\n",
"bugtrack_url": null,
"license": "MIT License",
"summary": "Image IO APIs for wide range image formats (Camera manufacturer RAW images, jpg, png, tif, dng, bmp, yuv, nv12 ), support Exif, interact nicely with numpy array.",
"version": "1.1.1",
"project_urls": {
"Homepage": "https://github.com/sygslhy/image-io",
"Issues": "https://github.com/sygslhy/image-io/issues",
"Releases": "https://github.com/sygslhy/image-io/releases",
"Repository": "https://github.com/sygslhy/image-io"
},
"split_keywords": [
"imageio",
" image-io",
" numpy-image",
" exif",
" bmp",
" camera raw image",
" raw io",
" dng io",
" tif",
" yuv io",
" nv12 io",
" canon",
" nikon",
" leica",
" sony",
" pentax",
" kodak"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "190e828bdd747181cc4a729d2b1ca788d894e95e95a020088dcf586085df4163",
"md5": "76b7ee62e50c2f8e343fbba8c3986b09",
"sha256": "4e3babb44ddb04f71d0fbd30608179f161f8ffd68bd687f9bc3c9f12327825ea"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "76b7ee62e50c2f8e343fbba8c3986b09",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 4010733,
"upload_time": "2025-03-08T11:11:04",
"upload_time_iso_8601": "2025-03-08T11:11:04.065689Z",
"url": "https://files.pythonhosted.org/packages/19/0e/828bdd747181cc4a729d2b1ca788d894e95e95a020088dcf586085df4163/cxx_image_io-1.1.1-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bd24473559c22e7cf18d843e4f30486e59fcd5f99b99f6dc53689e58839a5cc6",
"md5": "e7b239d3af7313d8fa40b9d35726ce50",
"sha256": "b7931589b2b9814e7577454b04b381e8ec531adf67ad468e0f3ebf7ea00b33f5"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp310-cp310-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "e7b239d3af7313d8fa40b9d35726ce50",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 4510085,
"upload_time": "2025-03-08T11:11:06",
"upload_time_iso_8601": "2025-03-08T11:11:06.404042Z",
"url": "https://files.pythonhosted.org/packages/bd/24/473559c22e7cf18d843e4f30486e59fcd5f99b99f6dc53689e58839a5cc6/cxx_image_io-1.1.1-cp310-cp310-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "61c4f6ed2be20a6b8a99989bb5ee977ae415d191c3632f08068ee079a4b1f481",
"md5": "1fa4e5c6d133c0e0d657b24aadfbfac1",
"sha256": "0ac7051c8417504ff4dd65c7a912da2075ceca1e1e1ab8a1c48fad39b9084f42"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp310-cp310-manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "1fa4e5c6d133c0e0d657b24aadfbfac1",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 5033723,
"upload_time": "2025-03-08T11:11:08",
"upload_time_iso_8601": "2025-03-08T11:11:08.283687Z",
"url": "https://files.pythonhosted.org/packages/61/c4/f6ed2be20a6b8a99989bb5ee977ae415d191c3632f08068ee079a4b1f481/cxx_image_io-1.1.1-cp310-cp310-manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0dcd5c67c55dc597976f8566dada97c0c4c8e2c9319a5fa8495a99af0d14b0ae",
"md5": "9d1bd4b66662a0e53bec9cd37abf36d8",
"sha256": "ac74492df404d5b4a3cde668c428d57a1862f364a5497976da8b3d282fd6746b"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp310-cp310-manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "9d1bd4b66662a0e53bec9cd37abf36d8",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 5070889,
"upload_time": "2025-03-08T11:11:09",
"upload_time_iso_8601": "2025-03-08T11:11:09.846341Z",
"url": "https://files.pythonhosted.org/packages/0d/cd/5c67c55dc597976f8566dada97c0c4c8e2c9319a5fa8495a99af0d14b0ae/cxx_image_io-1.1.1-cp310-cp310-manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1f885f1c2bb4b890f2e8cff3e2279ce441cf6f93ac0a85a7f465e4a458b8ad47",
"md5": "cf720a47984f2ab13fdb6e6af4ca1015",
"sha256": "e78e8d5974194403279485f628241a0102f5a407d8ac5a183b006889c2053748"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp310-cp310-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "cf720a47984f2ab13fdb6e6af4ca1015",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 6062051,
"upload_time": "2025-03-08T11:11:11",
"upload_time_iso_8601": "2025-03-08T11:11:11.456389Z",
"url": "https://files.pythonhosted.org/packages/1f/88/5f1c2bb4b890f2e8cff3e2279ce441cf6f93ac0a85a7f465e4a458b8ad47/cxx_image_io-1.1.1-cp310-cp310-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "60ab09c2d5fe3b012c439f1f73497cc4c77eb0270ae22740b764ee5f600f7794",
"md5": "b057c117b8247694660a5ecffd44eb6c",
"sha256": "199db9084012037b1a46967592dc24d342162ce99e816351cc8fa21559e70d8e"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp310-cp310-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "b057c117b8247694660a5ecffd44eb6c",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 6117154,
"upload_time": "2025-03-08T11:11:13",
"upload_time_iso_8601": "2025-03-08T11:11:13.057786Z",
"url": "https://files.pythonhosted.org/packages/60/ab/09c2d5fe3b012c439f1f73497cc4c77eb0270ae22740b764ee5f600f7794/cxx_image_io-1.1.1-cp310-cp310-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fc6fb3226d0d42dfa1c5660e63c002e9f76fb0dedb3c787f602d9d120f13bf0c",
"md5": "a6020b04418fc07c219abe2da0d39eb2",
"sha256": "3d8f26a2af8ec1d8961c12f3b3654a724f4a60a077bb90e3b492ef0444c9de15"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "a6020b04418fc07c219abe2da0d39eb2",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 3663259,
"upload_time": "2025-03-08T11:11:14",
"upload_time_iso_8601": "2025-03-08T11:11:14.605294Z",
"url": "https://files.pythonhosted.org/packages/fc/6f/b3226d0d42dfa1c5660e63c002e9f76fb0dedb3c787f602d9d120f13bf0c/cxx_image_io-1.1.1-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1b64fe722145fe0435073d48d6dc642db001986ade9a25b2e1064157257b8751",
"md5": "92b05fb61d154e068487c1621349b1fc",
"sha256": "5caacc5aa0809b65650d22da9ae1270cdf848d4699becafa977d4c2c3b57a0f6"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "92b05fb61d154e068487c1621349b1fc",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 4012981,
"upload_time": "2025-03-08T11:11:16",
"upload_time_iso_8601": "2025-03-08T11:11:16.159182Z",
"url": "https://files.pythonhosted.org/packages/1b/64/fe722145fe0435073d48d6dc642db001986ade9a25b2e1064157257b8751/cxx_image_io-1.1.1-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "71940846bb2d897840cf62914954282de72dcee6162af313aff22f165e0e9828",
"md5": "7795d796df8ee3e33c8d554e0662ace1",
"sha256": "24836a7c6f89af952fbe6409b2d1056a03cf42c3c8359a6de1a3eb01d0bfe573"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp311-cp311-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "7795d796df8ee3e33c8d554e0662ace1",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 4512434,
"upload_time": "2025-03-08T11:11:18",
"upload_time_iso_8601": "2025-03-08T11:11:18.075807Z",
"url": "https://files.pythonhosted.org/packages/71/94/0846bb2d897840cf62914954282de72dcee6162af313aff22f165e0e9828/cxx_image_io-1.1.1-cp311-cp311-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2986dbdaaa11f808aaa2c2750269341bfa49844b9ba50b528a1d4c3cdf385ebb",
"md5": "7de0ac49c7d469e5429fb0a95e7372ca",
"sha256": "04385fdb8bdf60fed626705794252ebceafc111134dd93265cc34f00d6d8c3aa"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp311-cp311-manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "7de0ac49c7d469e5429fb0a95e7372ca",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 5037842,
"upload_time": "2025-03-08T11:11:19",
"upload_time_iso_8601": "2025-03-08T11:11:19.599922Z",
"url": "https://files.pythonhosted.org/packages/29/86/dbdaaa11f808aaa2c2750269341bfa49844b9ba50b528a1d4c3cdf385ebb/cxx_image_io-1.1.1-cp311-cp311-manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "308ef59ab4edc485da740a8d9035017642c875748254b4045208245538989710",
"md5": "91b4b06c3422e4391f72512eeb827429",
"sha256": "de9a8d71058e639802c29e0d0c0264aa30935ce618b0417b4c51d67a78e1ae7d"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp311-cp311-manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "91b4b06c3422e4391f72512eeb827429",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 5075992,
"upload_time": "2025-03-08T11:11:21",
"upload_time_iso_8601": "2025-03-08T11:11:21.700478Z",
"url": "https://files.pythonhosted.org/packages/30/8e/f59ab4edc485da740a8d9035017642c875748254b4045208245538989710/cxx_image_io-1.1.1-cp311-cp311-manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "64c963ae385ef656309e769d160da9f67b1c95051b3321e5efaca234ff2c609a",
"md5": "3331cc59bad7a086258364dd3f8d4cd6",
"sha256": "7e8d2fc5c715f8094c9dd8fc30131ea1978ee29df4c14d35c95de1597267c79c"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp311-cp311-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "3331cc59bad7a086258364dd3f8d4cd6",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 6064649,
"upload_time": "2025-03-08T11:11:23",
"upload_time_iso_8601": "2025-03-08T11:11:23.838332Z",
"url": "https://files.pythonhosted.org/packages/64/c9/63ae385ef656309e769d160da9f67b1c95051b3321e5efaca234ff2c609a/cxx_image_io-1.1.1-cp311-cp311-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "26f69b12d6cad552f717f6a1ce605a46e05e34eb9c8ae8a526f4d87763d7b165",
"md5": "45eed0977cfff561e10ff61d114f5ecc",
"sha256": "9e41eef53102657d036cb6a7095c248b46df086e9b4344d5945988477cced45f"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp311-cp311-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "45eed0977cfff561e10ff61d114f5ecc",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 6118929,
"upload_time": "2025-03-08T11:11:25",
"upload_time_iso_8601": "2025-03-08T11:11:25.495083Z",
"url": "https://files.pythonhosted.org/packages/26/f6/9b12d6cad552f717f6a1ce605a46e05e34eb9c8ae8a526f4d87763d7b165/cxx_image_io-1.1.1-cp311-cp311-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6c7f8469d950d45208f52cc3206d5fd5413973feae6c321e0bec86b7e826d8d9",
"md5": "69b915a615854f90192ad6952e8f664d",
"sha256": "a3a49e5e4c6a2e597fcf139737e909c1066a83576aaddbe87f57e233dd024f6b"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "69b915a615854f90192ad6952e8f664d",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 3663199,
"upload_time": "2025-03-08T11:11:27",
"upload_time_iso_8601": "2025-03-08T11:11:27.080097Z",
"url": "https://files.pythonhosted.org/packages/6c/7f/8469d950d45208f52cc3206d5fd5413973feae6c321e0bec86b7e826d8d9/cxx_image_io-1.1.1-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "41aeb3dbf45b49e0bbcc1f7decf7b47c5214770a6c833be05c9d39c2bd292008",
"md5": "d83d06340a18590f84cb66e238fe0114",
"sha256": "047257805c38cc83cb00df596f0b6bbcb14f58bdf219d0e9d8f0dc93c44e22d7"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "d83d06340a18590f84cb66e238fe0114",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 4015311,
"upload_time": "2025-03-08T11:11:28",
"upload_time_iso_8601": "2025-03-08T11:11:28.602723Z",
"url": "https://files.pythonhosted.org/packages/41/ae/b3dbf45b49e0bbcc1f7decf7b47c5214770a6c833be05c9d39c2bd292008/cxx_image_io-1.1.1-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b16fdad009681789b69b660d89a997e92c5766ae578b6405b453a399a56ea786",
"md5": "5d96588ffca64a1ce696ff3f3d31f52e",
"sha256": "24be012aeb79980d840eadc97374cd5d360ab21e66f3d85dd36d671e7d486cb2"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp312-cp312-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "5d96588ffca64a1ce696ff3f3d31f52e",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 4521655,
"upload_time": "2025-03-08T11:11:30",
"upload_time_iso_8601": "2025-03-08T11:11:30.153688Z",
"url": "https://files.pythonhosted.org/packages/b1/6f/dad009681789b69b660d89a997e92c5766ae578b6405b453a399a56ea786/cxx_image_io-1.1.1-cp312-cp312-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "10e2c219e2a27e386c7ddc3348fe59b5a9110f3613f97f549e4af12854dbbb32",
"md5": "e2e7d6e7908771c8208566e33425966a",
"sha256": "b04e91eb263ab57f621e842c7d5bdfe6d3476df3e56e7bfa65ea7d6d432a0e2a"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp312-cp312-manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "e2e7d6e7908771c8208566e33425966a",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 5038923,
"upload_time": "2025-03-08T11:11:33",
"upload_time_iso_8601": "2025-03-08T11:11:33.881758Z",
"url": "https://files.pythonhosted.org/packages/10/e2/c219e2a27e386c7ddc3348fe59b5a9110f3613f97f549e4af12854dbbb32/cxx_image_io-1.1.1-cp312-cp312-manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7bc0dd04fa97b51f76aa49afe440d9c40c145b739e12aa26bea943dd033a28aa",
"md5": "e98df279b1d819113736c6abd1ceba82",
"sha256": "c293f0f0bed1942e5a3af244c94b28b840829cbac7166bf521823a15a4a15731"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp312-cp312-manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "e98df279b1d819113736c6abd1ceba82",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 5078350,
"upload_time": "2025-03-08T11:11:35",
"upload_time_iso_8601": "2025-03-08T11:11:35.440485Z",
"url": "https://files.pythonhosted.org/packages/7b/c0/dd04fa97b51f76aa49afe440d9c40c145b739e12aa26bea943dd033a28aa/cxx_image_io-1.1.1-cp312-cp312-manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ade32f732e703de1c2f43e721906347b85ddc68ab28f2411bde72d968947607a",
"md5": "d0638dd5bc191e019772b884b598d4d5",
"sha256": "f02fff7f05425e546bcc3025308c5e9df89abfa3081f7affdc41c469492582ad"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp312-cp312-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "d0638dd5bc191e019772b884b598d4d5",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 6066514,
"upload_time": "2025-03-08T11:11:37",
"upload_time_iso_8601": "2025-03-08T11:11:37.364042Z",
"url": "https://files.pythonhosted.org/packages/ad/e3/2f732e703de1c2f43e721906347b85ddc68ab28f2411bde72d968947607a/cxx_image_io-1.1.1-cp312-cp312-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "be695962a4134fcc1f46961b70945a9ce64d9cc548a19f15ecd2627d90c25ab7",
"md5": "c3f6ee06f9bf11f15a5f1f0d8fb14bf5",
"sha256": "efc7c778e5ed4a5e8e628fdbf9115f86e42b5f215999ba580f7008bdbe4c734b"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp312-cp312-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "c3f6ee06f9bf11f15a5f1f0d8fb14bf5",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 6123771,
"upload_time": "2025-03-08T11:11:39",
"upload_time_iso_8601": "2025-03-08T11:11:39.025511Z",
"url": "https://files.pythonhosted.org/packages/be/69/5962a4134fcc1f46961b70945a9ce64d9cc548a19f15ecd2627d90c25ab7/cxx_image_io-1.1.1-cp312-cp312-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "85b27701f2fb2a624092a02dccd4441527ab9f50d7fbffeeb53ff785d36c7be9",
"md5": "9d80d8f811de78e0cd2f68916a9ae485",
"sha256": "6e5ef88579a687af354ae87e9af636a83f36470cbe408d7bae5886f9c7b4d8b3"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "9d80d8f811de78e0cd2f68916a9ae485",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 3666279,
"upload_time": "2025-03-08T11:11:40",
"upload_time_iso_8601": "2025-03-08T11:11:40.582404Z",
"url": "https://files.pythonhosted.org/packages/85/b2/7701f2fb2a624092a02dccd4441527ab9f50d7fbffeeb53ff785d36c7be9/cxx_image_io-1.1.1-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0901355d9223a7f8e0a00348a88cc66c1107f66200f814caa9053384de7964de",
"md5": "02e87d14aeab594ea153a5a1c14916e5",
"sha256": "27a234813a9844d2b263908ad4d1df4c159a8752a88e4429731d985dfc8f637d"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "02e87d14aeab594ea153a5a1c14916e5",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 4015387,
"upload_time": "2025-03-08T11:11:42",
"upload_time_iso_8601": "2025-03-08T11:11:42.166157Z",
"url": "https://files.pythonhosted.org/packages/09/01/355d9223a7f8e0a00348a88cc66c1107f66200f814caa9053384de7964de/cxx_image_io-1.1.1-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2be093f3272a8da32592dea0744a3fd0a7fd5c8cc46685e4886f756b4811f2ca",
"md5": "73fc6b52939e6cbb98280c4d7b791134",
"sha256": "0252e5c4fbff1c619810507182223ea006d06cd81a7ba3dc11e6a429e59da383"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp313-cp313-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "73fc6b52939e6cbb98280c4d7b791134",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 4521708,
"upload_time": "2025-03-08T11:11:43",
"upload_time_iso_8601": "2025-03-08T11:11:43.739767Z",
"url": "https://files.pythonhosted.org/packages/2b/e0/93f3272a8da32592dea0744a3fd0a7fd5c8cc46685e4886f756b4811f2ca/cxx_image_io-1.1.1-cp313-cp313-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ca7c649e5edf10833b066ba15522f786465973e54a0b4012241a4b58fe0e6059",
"md5": "53f6dd1a3637c0dd476471f4720e7d1c",
"sha256": "fbd9f99faa0dfaaacfc470790b95711c4bf5f1d48c309b3e3e38af4651e633e9"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp313-cp313-manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "53f6dd1a3637c0dd476471f4720e7d1c",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 5039914,
"upload_time": "2025-03-08T11:11:45",
"upload_time_iso_8601": "2025-03-08T11:11:45.266688Z",
"url": "https://files.pythonhosted.org/packages/ca/7c/649e5edf10833b066ba15522f786465973e54a0b4012241a4b58fe0e6059/cxx_image_io-1.1.1-cp313-cp313-manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "41a57011ab42b8335466988011cfea03cef03739758f0f84aa64a2b36675983a",
"md5": "d45b738415f8b646b8198ecf00572e9b",
"sha256": "4c603ab13a20eac7fafbaf7055e553a973586a1017fbaf66fb1f90a647175b30"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp313-cp313-manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "d45b738415f8b646b8198ecf00572e9b",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 5080153,
"upload_time": "2025-03-08T11:11:46",
"upload_time_iso_8601": "2025-03-08T11:11:46.882461Z",
"url": "https://files.pythonhosted.org/packages/41/a5/7011ab42b8335466988011cfea03cef03739758f0f84aa64a2b36675983a/cxx_image_io-1.1.1-cp313-cp313-manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d96254d67d1ffa1322d74639c9d57163dc273d3fa1c45e7e4b198b26a4916a9e",
"md5": "ded1b8144610e61bc45c501fbccab2d3",
"sha256": "05d99791a974694824596f1a0ed83ddb93c1aab6188e76275a3c27aa5d99f503"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "ded1b8144610e61bc45c501fbccab2d3",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 6066414,
"upload_time": "2025-03-08T11:11:48",
"upload_time_iso_8601": "2025-03-08T11:11:48.928202Z",
"url": "https://files.pythonhosted.org/packages/d9/62/54d67d1ffa1322d74639c9d57163dc273d3fa1c45e7e4b198b26a4916a9e/cxx_image_io-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "98522eb9a969b7c6b9c0eb657debf44714b29422c0e8f2cef96f1089cedd2076",
"md5": "990cdb2e17f06fcc427a50df560196e3",
"sha256": "c1ceb83d8fe3110cfda5147388d2ae339dc89d2db84ffe04eaea68e876ec2b2f"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "990cdb2e17f06fcc427a50df560196e3",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 6124241,
"upload_time": "2025-03-08T11:11:50",
"upload_time_iso_8601": "2025-03-08T11:11:50.507004Z",
"url": "https://files.pythonhosted.org/packages/98/52/2eb9a969b7c6b9c0eb657debf44714b29422c0e8f2cef96f1089cedd2076/cxx_image_io-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "22a38b3ecad918f03b6c258d1b351ef27acd1ebe72d6790609cab1be95fa371d",
"md5": "44a257afe7ac8abd964d99101f6b5dea",
"sha256": "5059ae415401b1e55bf3d94135fb20b4a0f0c2dd3bcd81ccfe79127cdaabe8a1"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "44a257afe7ac8abd964d99101f6b5dea",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3666100,
"upload_time": "2025-03-08T11:11:52",
"upload_time_iso_8601": "2025-03-08T11:11:52.564378Z",
"url": "https://files.pythonhosted.org/packages/22/a3/8b3ecad918f03b6c258d1b351ef27acd1ebe72d6790609cab1be95fa371d/cxx_image_io-1.1.1-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "67b00058dddcd12465ec6278a58cf4cff232cbb0d4cfe94e7b90d5065798592f",
"md5": "17ed09bf07c8618fc6940643170f26cc",
"sha256": "d6331fd84f506cfb82fd20feb87d40f4eca760e7f597a8bab19be11c1582d1bf"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp39-cp39-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "17ed09bf07c8618fc6940643170f26cc",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 4010852,
"upload_time": "2025-03-08T11:11:54",
"upload_time_iso_8601": "2025-03-08T11:11:54.074626Z",
"url": "https://files.pythonhosted.org/packages/67/b0/0058dddcd12465ec6278a58cf4cff232cbb0d4cfe94e7b90d5065798592f/cxx_image_io-1.1.1-cp39-cp39-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0d0243d7db885754e2f6fd41da5b2df382005fd889678ca49769162ea6bddc21",
"md5": "d81b5ae1eb8c70c18131a8945dcdbf85",
"sha256": "599bdc6d68c6e8c234e8092f330da49335d58c38a4f73ba1bfe231c82c3174ed"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp39-cp39-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "d81b5ae1eb8c70c18131a8945dcdbf85",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 4510163,
"upload_time": "2025-03-08T11:11:55",
"upload_time_iso_8601": "2025-03-08T11:11:55.632207Z",
"url": "https://files.pythonhosted.org/packages/0d/02/43d7db885754e2f6fd41da5b2df382005fd889678ca49769162ea6bddc21/cxx_image_io-1.1.1-cp39-cp39-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6772d0a1c9e47c99c96c8138c177a24bc4d4c64a83fc7fe47021b179669e1be3",
"md5": "d6aacc6c6e02ee8f319f3d1b016f4d1d",
"sha256": "26db723c4ed9c771884938b56ee0426056a9667244dce3c9aba9b78c2832fa2b"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp39-cp39-manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "d6aacc6c6e02ee8f319f3d1b016f4d1d",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 5034679,
"upload_time": "2025-03-08T11:11:57",
"upload_time_iso_8601": "2025-03-08T11:11:57.527286Z",
"url": "https://files.pythonhosted.org/packages/67/72/d0a1c9e47c99c96c8138c177a24bc4d4c64a83fc7fe47021b179669e1be3/cxx_image_io-1.1.1-cp39-cp39-manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "75a1229ccdcf814c6d4b261c715094d36959f88d09ee29da1ec55061dd14444e",
"md5": "810927da5ad392f0b4aa8e199f35d532",
"sha256": "18681d747a8b8d4d7f32ad289f8fd16f7d8c9605b9fc114be92010ef8aba6e9e"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp39-cp39-manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "810927da5ad392f0b4aa8e199f35d532",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 5072700,
"upload_time": "2025-03-08T11:11:59",
"upload_time_iso_8601": "2025-03-08T11:11:59.363261Z",
"url": "https://files.pythonhosted.org/packages/75/a1/229ccdcf814c6d4b261c715094d36959f88d09ee29da1ec55061dd14444e/cxx_image_io-1.1.1-cp39-cp39-manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "21846d1a41ea8d957fe54faa52b812f622f56865541225415ffb34dbbfb875c0",
"md5": "87d08e3e3d207a86560d79e364b6e75a",
"sha256": "e03af3d0df59af1bafe8fe010849769a4451a7a62be886863b1ea4b8eff6924b"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp39-cp39-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "87d08e3e3d207a86560d79e364b6e75a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 6060555,
"upload_time": "2025-03-08T11:12:01",
"upload_time_iso_8601": "2025-03-08T11:12:01.435404Z",
"url": "https://files.pythonhosted.org/packages/21/84/6d1a41ea8d957fe54faa52b812f622f56865541225415ffb34dbbfb875c0/cxx_image_io-1.1.1-cp39-cp39-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d6576a6a9142de85af7370fa96bfc80b37d875f6c513ef38a2e6d85805a1922b",
"md5": "3ed872af677392d8e236257b7498ad9f",
"sha256": "53825d38338af01c26305651a00345daac575d9adc08aa490d60e42d4c0200d7"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp39-cp39-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "3ed872af677392d8e236257b7498ad9f",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 6115094,
"upload_time": "2025-03-08T11:12:03",
"upload_time_iso_8601": "2025-03-08T11:12:03.657721Z",
"url": "https://files.pythonhosted.org/packages/d6/57/6a6a9142de85af7370fa96bfc80b37d875f6c513ef38a2e6d85805a1922b/cxx_image_io-1.1.1-cp39-cp39-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a98c0ee85ce4fbda5357a8274ffb640649470f1b62d57af9cd548d47ca4d364b",
"md5": "e89f4ebac4728301b7850f369486eb62",
"sha256": "97bf433ffa9518daf317fa680616c43b4977d60c766aab6d94251a41126ed449"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "e89f4ebac4728301b7850f369486eb62",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3661883,
"upload_time": "2025-03-08T11:12:05",
"upload_time_iso_8601": "2025-03-08T11:12:05.664900Z",
"url": "https://files.pythonhosted.org/packages/a9/8c/0ee85ce4fbda5357a8274ffb640649470f1b62d57af9cd548d47ca4d364b/cxx_image_io-1.1.1-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "841c18cca05bb6bec61e11244924ed1a639a3d3514c075b893aaff236c4c9cf6",
"md5": "63cb8434e949ebd1ef562411096bb5f4",
"sha256": "cbe8a28ac0cbc607a3bb744a77f1135eca92f71f308d60429cd14f20d5f6aac6"
},
"downloads": -1,
"filename": "cxx_image_io-1.1.1.tar.gz",
"has_sig": false,
"md5_digest": "63cb8434e949ebd1ef562411096bb5f4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 34255,
"upload_time": "2025-03-08T11:12:07",
"upload_time_iso_8601": "2025-03-08T11:12:07.435054Z",
"url": "https://files.pythonhosted.org/packages/84/1c/18cca05bb6bec61e11244924ed1a639a3d3514c075b893aaff236c4c9cf6/cxx_image_io-1.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-03-08 11:12:07",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "sygslhy",
"github_project": "image-io",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "cxx-image-io"
}