Пример #1
0
def function_rgba(
    red_data_and_metadata_in: _DataAndMetadataIndeterminateSizeLike,
    green_data_and_metadata_in: _DataAndMetadataIndeterminateSizeLike,
    blue_data_and_metadata_in: _DataAndMetadataIndeterminateSizeLike,
    alpha_data_and_metadata_in: _DataAndMetadataIndeterminateSizeLike
) -> DataAndMetadata.DataAndMetadata:

    red_data_and_metadata_c = DataAndMetadata.promote_indeterminate_array(
        red_data_and_metadata_in)
    green_data_and_metadata_c = DataAndMetadata.promote_indeterminate_array(
        green_data_and_metadata_in)
    blue_data_and_metadata_c = DataAndMetadata.promote_indeterminate_array(
        blue_data_and_metadata_in)
    alpha_data_and_metadata_c = DataAndMetadata.promote_indeterminate_array(
        alpha_data_and_metadata_in)

    shape = DataAndMetadata.determine_shape(red_data_and_metadata_c,
                                            green_data_and_metadata_c,
                                            blue_data_and_metadata_c)

    if shape is None:
        raise ValueError("RGBA: data shapes do not match or are indeterminate")

    red_data_and_metadata = DataAndMetadata.promote_constant(
        red_data_and_metadata_c, shape)
    green_data_and_metadata = DataAndMetadata.promote_constant(
        green_data_and_metadata_c, shape)
    blue_data_and_metadata = DataAndMetadata.promote_constant(
        blue_data_and_metadata_c, shape)
    alpha_data_and_metadata = DataAndMetadata.promote_constant(
        alpha_data_and_metadata_c, shape)

    channels = (blue_data_and_metadata, green_data_and_metadata,
                red_data_and_metadata, alpha_data_and_metadata)

    if any([
            not Image.is_data_valid(data_and_metadata.data)
            for data_and_metadata in channels
    ]):
        raise ValueError("RGB: invalid data")

    rgba_image = numpy.empty(shape + (4, ), numpy.uint8)
    for channel_index, channel in enumerate(channels):
        data = channel._data_ex
        if data.dtype.kind in 'iu':
            rgba_image[..., channel_index] = numpy.clip(data, 0, 255)
        elif data.dtype.kind in 'f':
            rgba_image[...,
                       channel_index] = numpy.clip(numpy.multiply(data, 255),
                                                   0, 255)

    return DataAndMetadata.new_data_and_metadata(
        rgba_image,
        intensity_calibration=red_data_and_metadata.intensity_calibration,
        dimensional_calibrations=red_data_and_metadata.dimensional_calibrations
    )
Пример #2
0
def function_rgb(
    red_data_and_metadata: DataAndMetadata.DataAndMetadata,
    green_data_and_metadata: DataAndMetadata.DataAndMetadata,
    blue_data_and_metadata: DataAndMetadata.DataAndMetadata
) -> typing.Optional[DataAndMetadata.DataAndMetadata]:

    red_data_and_metadata = DataAndMetadata.promote_ndarray(
        red_data_and_metadata)
    green_data_and_metadata = DataAndMetadata.promote_ndarray(
        green_data_and_metadata)
    blue_data_and_metadata = DataAndMetadata.promote_ndarray(
        blue_data_and_metadata)

    shape = tuple(
        DataAndMetadata.determine_shape(red_data_and_metadata,
                                        green_data_and_metadata,
                                        blue_data_and_metadata))

    red_data_and_metadata = DataAndMetadata.promote_constant(
        red_data_and_metadata, shape)
    green_data_and_metadata = DataAndMetadata.promote_constant(
        green_data_and_metadata, shape)
    blue_data_and_metadata = DataAndMetadata.promote_constant(
        blue_data_and_metadata, shape)

    def calculate_data():
        rgb_image = numpy.empty(shape + (3, ), numpy.uint8)
        channels = (blue_data_and_metadata, green_data_and_metadata,
                    red_data_and_metadata)
        for channel_index, channel in enumerate(channels):
            data = channel.data

            if not Image.is_data_valid(data):
                return None

            if tuple(data.shape) != shape:
                return None

            if data.dtype.kind in 'iu':
                rgb_image[..., channel_index] = numpy.clip(data, 0, 255)
            elif data.dtype.kind in 'f':
                rgb_image[..., channel_index] = numpy.clip(
                    numpy.multiply(data, 255), 0, 255)
            else:
                return None
        return rgb_image

    if green_data_and_metadata.data_shape != shape or blue_data_and_metadata.data_shape != shape:
        return None

    return DataAndMetadata.new_data_and_metadata(
        calculate_data(),
        intensity_calibration=red_data_and_metadata.intensity_calibration,
        dimensional_calibrations=red_data_and_metadata.dimensional_calibrations
    )