/// <summary>
		/// Creates a minimal number of <see cref="DicomSoftcopyPresentationState"/>s for the given images.
		/// </summary>
		/// <remarks>
		/// <para>
		/// Presentation state instances can contain information for multiple images, but the images must all be of the same type,
		/// and contain non-conflicting presentation state information. This method creates a minimal number of presentation
		/// state objects for the collection of given images.
		/// </para>
		/// </remarks>
		/// <param name="images">The images for which presentation states are to be created.</param>
		/// <param name="callback">A callback method that initializes the instance properties of the created <see cref="DicomSoftcopyPresentationState"/>s.</param>
		/// <returns>A dictionary mapping of presentation images to its associated presentation state instance.</returns>
		/// <exception cref="ArgumentException">Thrown if softcopy presentation states are not supported for the type of any one of the given <paramref name="images"/>.</exception>
		/// <seealso cref="DicomSoftcopyPresentationState"/>
		public static IDictionary<IPresentationImage, DicomSoftcopyPresentationState> Create(IEnumerable<IPresentationImage> images, InitializeDicomSoftcopyPresentationStateCallback callback)
		{
			callback = callback ?? DefaultInitializeDicomSoftcopyPresentationStateCallback;

			List<IPresentationImage> grayscaleImages = new List<IPresentationImage>();
			List<IPresentationImage> colorImages = new List<IPresentationImage>();

			foreach (IPresentationImage image in images)
			{
				if (image is DicomGrayscalePresentationImage)
				{
					grayscaleImages.Add(image);
				}
				else if (image is DicomColorPresentationImage)
				{
					colorImages.Add(image);
				}
				else
				{
					throw new ArgumentException("DICOM presentation state serialization is not supported for that type of image.");
				}
			}

			Dictionary<IPresentationImage, DicomSoftcopyPresentationState> presentationStates = new Dictionary<IPresentationImage, DicomSoftcopyPresentationState>();
			if (grayscaleImages.Count > 0)
			{
				DicomGrayscaleSoftcopyPresentationState grayscaleSoftcopyPresentationState = new DicomGrayscaleSoftcopyPresentationState();
				callback.Invoke(grayscaleSoftcopyPresentationState);
				grayscaleSoftcopyPresentationState.Serialize(grayscaleImages);
				foreach (IPresentationImage image in grayscaleImages)
				{
					presentationStates.Add(image, grayscaleSoftcopyPresentationState);
				}
			}
			if (colorImages.Count > 0)
			{
				DicomColorSoftcopyPresentationState colorSoftcopyPresentationState = new DicomColorSoftcopyPresentationState();
				callback.Invoke(colorSoftcopyPresentationState);
				colorSoftcopyPresentationState.Serialize(colorImages);
				foreach (IPresentationImage image in colorImages)
				{
					presentationStates.Add(image, colorSoftcopyPresentationState);
				}
			}
			return presentationStates;
		}
		/// <summary>
		/// Creates a <see cref="DicomSoftcopyPresentationState"/> for a given image.
		/// </summary>
		/// <param name="image">The image for which the presentation state should be created.</param>
		/// <param name="callback">A callback method that initializes the instance properties of the created <see cref="DicomSoftcopyPresentationState"/>.</param>
		/// <returns>One of the derived <see cref="DicomSoftcopyPresentationState"/> classes, depending on the type of the <paramref name="image"/>.</returns>
		/// <exception cref="ArgumentException">Thrown if softcopy presentation states for the type of the given <paramref name="image"/> are not supported.</exception>
		/// <seealso cref="DicomSoftcopyPresentationState"/>
		public static DicomSoftcopyPresentationState Create(IPresentationImage image, InitializeDicomSoftcopyPresentationStateCallback callback)
		{
			callback = callback ?? DefaultInitializeDicomSoftcopyPresentationStateCallback;

			if (image is DicomGrayscalePresentationImage)
			{
				DicomGrayscaleSoftcopyPresentationState grayscaleSoftcopyPresentationState = new DicomGrayscaleSoftcopyPresentationState();
				callback.Invoke(grayscaleSoftcopyPresentationState);
				grayscaleSoftcopyPresentationState.Serialize(image);
				return grayscaleSoftcopyPresentationState;
			}
			else if (image is DicomColorPresentationImage)
			{
				DicomColorSoftcopyPresentationState colorSoftcopyPresentationState = new DicomColorSoftcopyPresentationState();
				callback.Invoke(colorSoftcopyPresentationState);
				colorSoftcopyPresentationState.Serialize(image);
				return colorSoftcopyPresentationState;
			}
			else
			{
				throw new ArgumentException("DICOM presentation state serialization is not supported for that type of image.");
			}
		}