| File: System\Drawing\ImageFormatConverter.cs | Web Access |
| Project: src\winforms\src\System.Drawing.Common\src\System.Drawing.Common.csproj (System.Drawing.Common) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.ComponentModel; using System.ComponentModel.Design.Serialization; using System.Drawing.Imaging; using System.Globalization; using System.Reflection; namespace System.Drawing; [SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "Heif and Webp are referenced here for " + "design-time support, the user is responsible to ensure that they are used on a supported version of Windows.")] public class ImageFormatConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType) { return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); } public override bool CanConvertTo(ITypeDescriptorContext? context, [NotNullWhen(true)] Type? destinationType) { if ((destinationType == typeof(string)) || (destinationType == typeof(InstanceDescriptor))) { return true; } return base.CanConvertTo(context, destinationType); } public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) { // we must be able to convert from short names and long names if (value is not string strFormat) { // case #1, this is not a string return base.ConvertFrom(context, culture, value); } if ((strFormat[0] == '[') && (strFormat.Length >= 50) && Guid.TryParse(strFormat.AsSpan(14, 36), out Guid guid)) { // case #2, this is probably a long format (guid) return new ImageFormat(guid); } // case #3, this is probably a short format if (strFormat.Equals("Bmp", StringComparison.OrdinalIgnoreCase)) return ImageFormat.Bmp; else if (strFormat.Equals("Emf", StringComparison.OrdinalIgnoreCase)) return ImageFormat.Emf; else if (strFormat.Equals("Exif", StringComparison.OrdinalIgnoreCase)) return ImageFormat.Exif; else if (strFormat.Equals("Gif", StringComparison.OrdinalIgnoreCase)) return ImageFormat.Gif; else if (strFormat.Equals("Icon", StringComparison.OrdinalIgnoreCase)) return ImageFormat.Icon; else if (strFormat.Equals("Jpeg", StringComparison.OrdinalIgnoreCase)) return ImageFormat.Jpeg; else if (strFormat.Equals("MemoryBmp", StringComparison.OrdinalIgnoreCase)) return ImageFormat.MemoryBmp; else if (strFormat.Equals("Png", StringComparison.OrdinalIgnoreCase)) return ImageFormat.Png; else if (strFormat.Equals("Tiff", StringComparison.OrdinalIgnoreCase)) return ImageFormat.Tiff; else if (strFormat.Equals("Wmf", StringComparison.OrdinalIgnoreCase)) return ImageFormat.Wmf; else if (strFormat.Equals("Heif", StringComparison.OrdinalIgnoreCase)) return ImageFormat.Heif; else if (strFormat.Equals("Webp", StringComparison.OrdinalIgnoreCase)) return ImageFormat.Webp; throw new FormatException(SR.Format(SR.ConvertInvalidPrimitive, strFormat, nameof(ImageFormat))); } public override object? ConvertTo(ITypeDescriptorContext? context, CultureInfo? culture, object? value, Type destinationType) { if (value is ImageFormat imgFormat) { if (destinationType == typeof(string)) { return imgFormat.ToString(); } if (destinationType == typeof(InstanceDescriptor)) { string? strFormat = null; if (imgFormat.Guid.Equals(ImageFormat.Bmp.Guid)) strFormat = "Bmp"; else if (imgFormat.Guid.Equals(ImageFormat.Emf.Guid)) strFormat = "Emf"; else if (imgFormat.Guid.Equals(ImageFormat.Exif.Guid)) strFormat = "Exif"; else if (imgFormat.Guid.Equals(ImageFormat.Gif.Guid)) strFormat = "Gif"; else if (imgFormat.Guid.Equals(ImageFormat.Icon.Guid)) strFormat = "Icon"; else if (imgFormat.Guid.Equals(ImageFormat.Jpeg.Guid)) strFormat = "Jpeg"; else if (imgFormat.Guid.Equals(ImageFormat.MemoryBmp.Guid)) strFormat = "MemoryBmp"; else if (imgFormat.Guid.Equals(ImageFormat.Png.Guid)) strFormat = "Png"; else if (imgFormat.Guid.Equals(ImageFormat.Tiff.Guid)) strFormat = "Tiff"; else if (imgFormat.Guid.Equals(ImageFormat.Wmf.Guid)) strFormat = "Wmf"; if (strFormat is not null) { return new InstanceDescriptor(typeof(ImageFormat).GetProperty(strFormat), null); } else { ConstructorInfo? ctor = typeof(ImageFormat).GetConstructor([typeof(Guid)]); return new InstanceDescriptor(ctor, new object[] { imgFormat.Guid }); } } } return base.ConvertTo(context, culture, value, destinationType); } public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext? context) { return new StandardValuesCollection(new ImageFormat[] { ImageFormat.MemoryBmp, ImageFormat.Bmp, ImageFormat.Emf, ImageFormat.Wmf, ImageFormat.Gif, ImageFormat.Jpeg, ImageFormat.Png, ImageFormat.Tiff, ImageFormat.Exif, ImageFormat.Icon, ImageFormat.Heif, ImageFormat.Webp }); } public override bool GetStandardValuesSupported(ITypeDescriptorContext? context) => true; }