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 )
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 )