2013-10-01 74 views
0

我試圖將圖像的紅色值增加50%。這裏是我的代碼:」不能隱式地將類型'double'轉換爲'byte'「

public static Bitmap IncreaseRedFiftyPercent(Bitmap b) 
    { 
     Bitmap temp = (Bitmap) b; 
     Bitmap bmap = (Bitmap)temp.Clone(); 
     Color c; 
     for (int i = 0; i < bmap.Width; i++) 
     { 
      for (int j = 0; j < bmap.Height; j++) 
      { 
       c = bmap.GetPixel(i, j); 
       byte increase = c.R + c.R * 0.5; //This line gives error 

       bmap.SetPixel(i, j, Color.FromArgb(increase, c.G, c.B)); 
      } 
     } 
     b = (Bitmap)bmap.Clone(); 
     return b; 
    } 

這裏是我做的:我讀了圖像的所有像素,並且由百分之五十增加紅色值,並保持藍色和綠色是相同的。但線

byte increase = c.R + c.R * 0.5; //This line gives error 

給我一個錯誤說

Cannot implicitly convert type 'double' to 'byte'. An explicit conversion exists (are you missing  
a cast?)  

,我不能double轉換成字節?這看起來很明智,我在做什麼,這裏有什麼問題?

感謝

+0

只有一行甚至很重要 - 最後一行。 '字節b = somedouble;'無效。你必須明確地將* double *轉換回* byte *(例如'(byte)somedouble')。該錯誤消息表示沒有隱式轉換(如從字節 - > double)。 – user2246674

+0

只是使用'字節增加=(字節)(c.R + c.R * 0.5);' –

+0

感謝您的答案,我這樣做,但它似乎不像紅色增加。我如何檢查我的代碼是否正在做我真正想要的?我試圖使用一些圖像查看器來增加紅色並比較圖片,但我無法做到。任何訴訟l,請檢查一些程序嗎? – yrazlik

回答

5

你可以用這個代替,雖然它不會佔溢(超過255的任何結果將翻轉至0):

byte increase = (byte)(c.R + c.R/2); 

請注意,我用的/2代替*0.5使用整數數學而不是浮點數學。如果您正在處理大量大圖像,則性能差異可能很大。

根據您的要求,這樣的事情可能工作:

byte increase = (byte)(Math.Min(c.R + c.R/2 , 255)); 
+0

感謝溢出檢查建議,我會用if-else語句處理它 – yrazlik

+0

'Math.Min'應該可以正常工作。 –

+0

哦謝謝,我現在就試試吧 – yrazlik

1

的問題是,當你把一個字節(如c.R)和由雙乘(如0.5),那麼結果爲雙(因爲一個字節可能沒有精度來保存結果)。然後,您嘗試將此分配給一個字節,並且由於錯誤消息表明不存在隱式轉換,因此您必須將其明確轉換。

這可以用的東西做類似

byte increase = (byte)(c.R + c.R * 0.5); 

而且我已經被另外一個答案,這將不會檢查溢出,所以如果c.R超過170,那麼你會得到溢出的問題提醒。爲此,你會想要做一些像斯坦利最小技巧的東西。

8

算術在C#是通過首先確定通過從可能的運算符的列表中選擇要使用的操作者執行的:

int * int --> int 
long * long --> long 
double * double --> double 

等;該名單很長。

在你的情況下,最好的運算符是double * double --> double,所以字節被轉換爲double。這是無損。但結果是雙重的;它可能有一個小數部分,其大小可能比最大可能的字節大。轉換回字節是有損。因此,您需要通過將轉換插入字節來說「我確保我真的想要進行這種有損轉換」。

現在,在你這樣做之前,你應該確保你實際上做的是正確的事情!如果字節已經達到200,那麼將其增加50%到300.00,然後將其轉換爲只能在0和255之間的字節,這可能會產生意想不到的結果。在插入演員之前仔細考慮。

+0

謝謝,Math.min函數幫助檢查溢出 – yrazlik

相關問題