2013-08-04 14 views
5
Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
            Screen.PrimaryScreen.Bounds.Height); 
Graphics graphics = Graphics.FromImage(bitmap as Image); 
graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size); 
bitmap.Save(@"C:\Temp\printscreen.jpg", ImageFormat.Jpeg); 

To jest mój kod przycisku drukowania ekranu. Problem polega na tym, że wciskam przycisk kilka razy i po prostu piszę nad starym plikiem obrazu (printscreen.jpg), nie utworzy on kolejnego nowego pliku obrazu, takiego jak printscreen1.jpg.Zapisz ekran drukowania w C#

+5

To na pewno nie będzie, jeśli nie poinformować go. :) – Chris

Odpowiedz

6

Spróbuj tego. Za każdym razem wygeneruje unikalny plik.

Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
            Screen.PrimaryScreen.Bounds.Height); 
Graphics graphics = Graphics.FromImage(bitmap as Image); 
graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size); 
bitmap.Save(@"C:\Temp\printscreen"+Guid.NewGuid()+".jpg", ImageFormat.Jpeg); 

LUB

Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
            Screen.PrimaryScreen.Bounds.Height); 
Graphics graphics = Graphics.FromImage(bitmap as Image); 
graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size); 
var date = DateTime.Now.ToString("MMddyyHmmss"); 
bitmap.Save(@"C:\Temp\printscreen"+date+".jpg", ImageFormat.Jpeg); 
+5

+1 (alias przychodzę w pokoju) A może używać aktualnej daty zamiast identyfikatora GUID? Wydaje się bardziej odpowiednie. –

+0

Zaktualizowałem moją odpowiedź, aby pokazać oba –

6

nie stworzy kolejny nowy plik obrazu

nie prosisz go utworzyć, kod

bitmap.Save(@"C:\Temp\printscreen.jpg", ImageFormat.Jpeg); 

jest zawsze pisząc do ten sam plik.

nowy plik obrazu, takich jak printscreen1.jpg

Jeśli chcesz utworzyć nowy plik, trzeba wygenerować pliku dynamicznie. Coś jak

string fileName = System.IO.Path.GetTempPath() + DateTime.Now.ToString() + ".jpg"; 
bitmap.Save(fileName, ImageFormat.Jpeg); 
1

utworzyć pole powiedzieć counter i increment go na każdym button click i użyć go do nazwy pliku -

bitmap.Save(@"C:\Temp\printscreen" + (counter++) + ".jpg", ImageFormat.Jpeg); 
3

Można policzyć ile plików już istnieje w katalogu, które zaczynają się printscreen.

int count = Directory.EnumerateFiles(@"C:\Temp\").Where(x => x.StartsWith("printscreen")).Count(); 
bitmap.Save(String.Format(@"C:\Temp\printscreen{0}.jpg", count), ImageFormat.Jpeg); 

Może to być wolniejsze, jeśli masz dużo plików, ponieważ musi on przechodzić przez nie, ale jest bardziej zautomatyzowany.

Inną opcją jest utworzenie pliku przechowującego bieżący numer licznika.

File.Write("Counter.txt", counter.ToString()); 

Następnie, gdy chcesz uruchomić licznik po ponownym uruchomieniu programu, możesz to zrobić.

int counter = 0; 
if(File.Exists("Counter.txt")) 
    counter = Int32.Parse(File.ReadAllText("Counter.txt")); 

bitmap.Save(String.Format(@"C:\Temp\printscreen{0}.jpg", ++counter), ImageFormat.Jpeg); 

Oczywiście, jeśli nie planujesz ponowne uruchomienie aplikacji i kontynuowanie sekwencji, można uniknąć przechowywanie licznika w pliku tekstowym i po prostu zwiększamy licznik od zera.

1

Można też spróbować tak:

int number; 
string[] path = Directory.GetFiles(@"C:\Temp\", @"PrintScreen*"); 

if (path.Length == 0) 
{ bitmap.Save(@"C:\Temp\printscreen.jpg", ImageFormat.Jpeg); return; } 

Array.Sort(path); 
Array.Reverse(path); 

int.TryParse(Regex.Match(path[0], @"(\d+)(?=\.jpg)").ToString(), out number); 
bitmap.Save(@"C:\Temp\printscreen" + (number + 1).ToString() + ".jpg", ImageFormat.Jpeg); 

myślę, że byłoby bardziej efektywne, aby wybrać ostatni plik sortując je w kolejności malejącej raczej niż wyliczanie nad nimi. Ponadto, nie trzeba śledzić osobnego licznika, wybierz ostatnią liczbę i zwiększ ją.

0
    { 
        //Application.DoEvents(); 
        Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 
        Graphics graphics = Graphics.FromImage(printscreen as Image); 
        graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size); 
        string path = ""; 
        if (forLog) 
        { 
         path = LoggerPath + StudentNumber.ToString() + "\\" + SessionID.ToString() + "\\"; 
        } 
        else 
        { 
         path = PrintScreenPath + StudentNumber.ToString() + "\\" + SessionID.ToString() + "\\"; 
        } 
        if (!Directory.Exists(path)) 
         Directory.CreateDirectory(path); 
        string fileName = DateTime.Now.Ticks.ToString(); 
        SaveJPGWithCompressionSetting(printscreen, path + fileName + ".jpeg", 17L); 
        printscreen.Dispose(); 
        graphics.Dispose(); 
        return fileName; 
       } 

I ere jest SaveJPGWithCompressionSetting metoda

private void SaveJPGWithCompressionSetting(Image image, string szFileName, long lCompression) 
    { 
      try 
      { 
       EncoderParameters eps = new EncoderParameters(1); 
       eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, lCompression); 
       ImageCodecInfo ici = GetEncoderInfo("image/jpeg"); 
       image.Save(szFileName, ici, eps); 
      } 

}