我将图像从一种格式转换为另一种格式,并希望使用该开关处理不同的格式。 System.Drawing.Imaging.ImageFormat是公共密封类,交换机不能使用它。 下面的代码正常,但我想在这里使用开关。你能帮我提一些建议吗?
public static void ConvertImageFormat(Image image, string targetImageFilePath, int newWidth, int newHeight, ImageFormat imageFormatToConvert)
{
using (Bitmap bitmap = new Bitmap(image, newWidth, newHeight))
{
using (Graphics graphic = Graphics.FromImage(bitmap))
{
graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphic.SmoothingMode = SmoothingMode.HighQuality;
graphic.CompositingQuality = CompositingQuality.HighQuality;
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphic.DrawImage(image, 0, 0, newWidth, newHeight);
if (Equals(ImageFormat.Png, imageFormatToConvert))
{
bitmap.Save(targetImageFilePath, ImageFormat.Png);
}
else if (Equals(ImageFormat.Gif, imageFormatToConvert))
{
bitmap.Save(targetImageFilePath, ImageFormat.Gif);
}
else if (Equals(ImageFormat.Jpeg, imageFormatToConvert))
{
ImageCodecInfo[] arrImageCodecInfo = ImageCodecInfo.GetImageEncoders();
using (EncoderParameters encoderParameters = new EncoderParameters(1))
{
encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 90L);
bitmap.Save(targetImageFilePath, arrImageCodecInfo[1], encoderParameters);
}
}
else
{
throw new Exception($"Convert to <{imageFormatToConvert.ToString()}> from " +
$"<{new ImageFormatConverter().ConvertToString(image.RawFormat)}>" +
$" image format is not supported now.");
}
}
}
}
答案 0 :(得分:0)
不,您不能将Switch与ImageFormat
一起使用,因为它是类。
在C#6中,匹配表达式必须是返回a的表达式 以下类型的值:
a char. a string. a bool. an integral value, such as an int or a long. an enum value.
从C#7开始,匹配表达式可以是任何非空值 表达
因为C#6仅支持常量模式而不允许 重复常量值,案例标签定义互斥 值,只有一个模式可以匹配匹配表达式。作为一个 结果,case语句出现的顺序并不重要。
但是,在C#7中,由于支持其他模式,因此需要使用案例标签 无需定义互斥值,并且多个模式可以 匹配匹配表达式。因为只有switch中的语句 包含第一个匹配模式的部分被执行, 在哪种情况下语句出现的顺序现在很重要。如果C#检测到 一个开关部分,其case语句等同于 或者是以前语句的子集,它会生成编译器错误, CS8120,“开关案例已由先前案件处理过。”
switch (C# Reference) MSDN article
不是尝试使用Switch,而是建议您将if else语句简化为以下内容:
if (Equals(ImageFormat.Png, imageFormatToConvert) || Equals(ImageFormat.Gif, imageFormatToConvert) || Equals(ImageFormat.Jpeg, imageFormatToConvert)
{
if (Equals(ImageFormat.Jpeg, imageFormatToConvert))
{
ImageCodecInfo[] arrImageCodecInfo = ImageCodecInfo.GetImageEncoders();
using (EncoderParameters encoderParameters = new EncoderParameters(1))
{
encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 90L);
bitmap.Save(targetImageFilePath, arrImageCodecInfo[1], encoderParameters);
}
}
else{
bitmap.Save(targetImageFilePath, imageFormatToConvert);
}
}
else
{
throw new Exception($"Convert to <{imageFormatToConvert.ToString()}> from " +
$"<{new ImageFormatConverter().ConvertToString(image.RawFormat)}>" +
$" image format is not supported now.");
}
答案 1 :(得分:0)
只需ToString()
ImageFormat
,然后启用(string
)结果?
ImageFormat
会覆盖ToString
以产生一个人类可读的&#34;结果。请参阅MSDN。
var desiredImageFormatName = imageFormatToConvert.ToString();
switch (desriredImageFormatName)
{
case "JPEG": // or whatever ImageFormat.Jpeg.ToString() returns
...
}