是否可以使用开关选择ImageFormat?

时间:2017-06-21 13:50:47

标签: c# switch-statement image-formats

我将图像从一种格式转换为另一种格式,并希望使用该开关处理不同的格式。 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.");
                }
            }
        }
    }

2 个答案:

答案 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
        ...
}