2017-06-21 51 views
1

我將圖像從一種格式轉換爲另一種格式,並希望使用該開關處理不同的格式。 System.Drawing.Imaging.ImageFormat是公共密封類,交換機不能使用它。 下面的代碼正在工作,但我想在這裏使用開關。你能幫我一些建議嗎?是否可以使用開關選擇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

不,您不能使用開關ImageFormat,因爲它是類。

在C#6,匹配表達式必須是一個返回 值以下類型的表達式:

​​

用C#7開始,匹配表達式可以是任何非空 表達。因爲C#6僅支持常量模式並且不允許重複常量值,所以case標籤定義了互斥的 值,並且只有一個模式可以匹配匹配表達式。作爲 結果,case語句出現的順序並不重要。

在C#7,但是,由於其它圖案被支撐,殼體標籤 不必限定互斥值,和多個圖案可以 匹配匹配表達式。由於只執行包含第一個匹配模式的開關 部分中的語句,因此現在很重要的是出現哪種情況語句的 順序。如果C#檢測到 開關部分的case語句或語句與 等效,或者是先前語句的子集,則會生成編譯器錯誤 CS8120,「開關情況已由以前的情況處理過。」

switch (C# Reference) MSDN article

,而不是試圖用交換機我會建議你簡化你的,如果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."); 
} 
+0

謝謝。在提出問題之前,我閱讀了這個文檔,但可能是我錯過了一些東西。 UPD:簡化這種方式並不好,在我看來,因爲如果你添加支持[tiff格式](https://stackoverflow.com/questions/11668945/convert-tiff-to-jpg-format/11669224#11669224)你需要添加新的如果。 –

+0

@NikitaSychou我已經寫了該代碼只看到你提供的代碼,並且無處寫下這種情況可能會改變。是的,如果你添加其他格式的代碼的特殊部分,當然這個代碼不是簡化任何事情。 –

0

只是ToString()ImageFormat,並接通(string)結果?

ImageFormat重寫ToString以產生「人​​可讀」結果。請參閱MSDN

var desiredImageFormatName = imageFormatToConvert.ToString(); 

switch (desriredImageFormatName) 
{ 
    case "JPEG": // or whatever ImageFormat.Jpeg.ToString() returns 
     ... 
} 
+2

我認爲這不是一個好的解決方案,就好像有一天'ImageFormat.Jpeg.ToString()'將被改變,而不是'Jpeg'將返回'JPEG',他的代碼將停止工作 –

+0

@ S.Petrosov:實際上,我同意。最好不要使用ImageFomat作爲參數類型,而只需使用'enum'或'string',這將更容易'開啓'。我看不出爲什麼使用這個類型是嚴格必要的。 –

+0

我認爲OP沒有意識到在這種情況下使用交換機的危險,並且正在考慮如何簡化代碼。但結果是,即使使用開關,代碼也會非常像他已有的代碼。 –

相關問題