pythonnet:将 System.Drawing.Bitmap 转换为 PIL.Image

pythonnet: Convert System.Drawing.Bitmap to PIL.Image

我有一个创建图像的 .net 库。我需要在 python 中访问此图像,因此我尝试使用 pythonnet 调用 .net DLL。

我正在尝试使用以下答案转换 .NET 字节:然后创建 PIL.Image:

Convert Bytes[] to Python Bytes Using PythonNet PIL: Convert Bytearray to Image

这是我的 python 代码:

import clr
preloadingiterator = clr.AddReference(r"C:\Users\Ian\source\repos\PreloadingIterator\PreloadingIterator\bin\Debug\net48\PreloadingIterator.dll")
from PreloadingIterator import ImageIterator, ImageBytesIterator, FileBytesIterator
from pathlib import Path
import io
from PIL import Image


class FileBytesIteratorWrapper():

    def __init__(self, paths):
        self.paths = paths
        self.iterator = FileBytesIterator(paths)

    def __iter__(self):
        for netbytes in self.iterator:
            pythonbytes = bytes(netbytes)
            numBytes = len(pythonbytes)
            image = Image.frombytes('RGB', (1920, 1080), pythonbytes)
            yield image

此错误为:

ValueError: not enough image data

我认为这是因为我 return 是 PNG 编码字节,而不是原始字节,所以我这样更改了我的代码:

image = Image.frombytes('RGB', (1920, 1080), pythonbytes, decoder_name='png')

哪些错误:

'OSError: decoder png not available'

如何 return 来自 .NET 的图像数据并将其解码为 PIL 图像?

从 .NET 返回原始图像适用于此 python:

def __iter__(self):
    for netbytes in self.iterator:
        pythonbytes = bytes(netbytes)
        image = Image.frombytes('RGB', (1920, 1080), pythonbytes)
        yield image

然而,这样做的速度令人望而却步,因为 pythonnet 每张图像需要 1.3 秒,而在 python 或 .net 中原生需要 0.07s。

因此我停止使用 pythonnet 并将其重写为 TCP client/server 架构。