2013-08-23 2 views
-1

У меня ошибка преобразования. Мне нужна помощь в преодолении.Преобразование типа void в System.Drawing.Image

На данный момент я пытаюсь снять захват экрана на своем рабочем столе и сохранить его в переменной, которую я могу передать. Сейчас этот код выглядит следующим образом:

ScreenCapture capture = new ScreenCapture(); 
Image capturedImageObj= capture.CaptureImage(showCursor, curSize, curPosition, startPoint, Point.Empty, bounds, _screenPath, fi); 

Однако, делая это, я получаю следующее сообщение об ошибке:

Cannot implicitly convert type 'void' to 'System.Drawing.Image'

Итак, я попытался типовому кастовал capture.CaptureImage и он произвел то же самое ошибка. Линия я написал, было так:

Image capturedImageObj= (Image)capture.CaptureImage(showCursor, curSize, curPosition, startPoint, Point.Empty, bounds, _screenPath, fi); 

метод My CaptureImage заключается в следующем:

public void CaptureImage(bool showCursor, Size curSize, Point curPos, Point SourcePoint, Point DestinationPoint, Rectangle SelectionRectangle, string FilePath, string extension) 
    { 
     Bitmap bitmap = new Bitmap(SelectionRectangle.Width, SelectionRectangle.Height); 

     using (Graphics g = Graphics.FromImage(bitmap)) 
     { 
      g.CopyFromScreen(SourcePoint, DestinationPoint, SelectionRectangle.Size); 

      if (showCursor) 
      { 
       Rectangle cursorBounds = new Rectangle(curPos, curSize); 
       Cursors.Default.Draw(g, cursorBounds); 
      } 
     } 

     if (saveToClipboard) 
     { 
      Image img = (Image)bitmap; 

      if (OnUpdateStatus == null) return; 

      ProgressEventArgs args = new ProgressEventArgs(img); 
      OnUpdateStatus(this, args); 

     } 

Таким образом, видя, что я поставил метод ничтожным, я изменил его так, что он потребует изображение так:

public Image CaptureImage(bool showCursor, Size curSize, Point curPos, Point SourcePoint, Point DestinationPoint, Rectangle SelectionRectangle, string FilePath, string extension) 

Но тогда он генерировал следующее сообщение об ошибке:

An object of a type convertible to 'System.Drawing.Image' is required.

точки этой ошибки следующего фрагмента кода со вторым, если заявление является виновником:

if (saveToClipboard) 
    { 
    Image img = (Image)bitmap; 

    if (OnUpdateStatus == null) return; 

    ProgressEventArgs args = new ProgressEventArgs(img); 
    OnUpdateStatus(this, args); 
} 

Я выбежал из идеи о том, как разбить эти ошибки. Может ли кто-нибудь пролить некоторый свет/новое понимание, чтобы я мог избавиться от них?

+1

Для справок в будущем, все, хотя в целом хорошо показывать вещи, которые вы пробовали. В этом примере вы ставите вопрос немного запутанным, показывая каждое изменение вашего кода.Было бы лучше просто показать ваш текущий код, строку с ошибками и сообщение об ошибке ... опять же, Googling сообщение об ошибке должно было решить вашу проблему в любом случае – musefan

+0

Просто хотел дать подробный обзор того, что у меня есть пробовал и избегал голосования. Не работает :( – N0xus

+0

Это был не мой нисходящий сигнал, и я понимаю, что вы просто пытались предоставить как можно больше информации. Именно в этом случае вы, возможно, немного сбивали с толку, слишком много изменений кода – musefan

ответ

3

Ваш CaptureImage требует Image возвращено, но вы возвращаете void/nothing в if (OnUpdateStatus == null). Даже вы возвращаете некоторое изображение там, вы все равно должны вернуть изображение за пределами этого блока if, иначе он может пожаловаться на то, что Not all code paths return a value.

public Image CaptureImage(bool showCursor, Size curSize, Point curPos, Point SourcePoint, Point DestinationPoint, Rectangle SelectionRectangle, string FilePath, string extension) 
{ 
    Bitmap bitmap = new Bitmap(SelectionRectangle.Width, SelectionRectangle.Height); 

    using (Graphics g = Graphics.FromImage(bitmap)) 
    { 
     g.CopyFromScreen(SourcePoint, DestinationPoint, SelectionRectangle.Size); 

     if (showCursor) 
     { 
      Rectangle cursorBounds = new Rectangle(curPos, curSize); 
      Cursors.Default.Draw(g, cursorBounds); 
     } 
    } 

    if (saveToClipboard) 
    { 
     Image img = (Image)bitmap; 

     if (OnUpdateStatus == null) return bitmap;//<--- here 

     ProgressEventArgs args = new ProgressEventArgs(img); 
     OnUpdateStatus(this, args); 

    } 
    return bitmap;//<--- and here 
} 
1

, потому что ваш метод

public Image CaptureImage( 

ожидает возвращаемый тип изображения, который не возвращается. В вашем коде есть 2 пункта возврата.

Пункт 1:

if (OnUpdateStatus == null) return; 

дает ошибку, потому что, как ваш тип возвращаемого значения должен быть образ, и вы не возвращаете, что так что вы должны сделать это как

if (OnUpdateStatus == null) 
    return null; //or a valid image 

и перед выходом из метода вам необходимо вернуть изображение колодце

return someImage; //as the last line in your method before closing brackets 
+2

@musefan StackExchange - это не место для эго. Пожалуйста, будьте более продуктивными с вашими комментариями, например, указывая на то, что делает ответ дерьмовым. – Romoku

+0

@Romoku: В поле комментариев не хватит символов для копирования и вставки вопроса. Если NoOne читает вопрос полностью, тогда они будут знать, в чем проблема. И я не думаю, что «эго» - это соответствующее обвинение в этом контексте ... – musefan

1

Необходимо вернуть изображение с помощью метода CaptureImage. Ваше заявление о возврате ничего не возвращает.

Смежные вопросы