walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/2010
|
ciao a tutti.
avrei la neccessità di fare uno screenshot,ma non di tutto il monitor solo di un pezzo
nel dettaglio:
ho una form con una picturebox e un bottone
la form ha la proprietà trasparencykey impostata su un colore
la picturebox ha la proprietà backcolor impostata sullo stesso colore senza nessuna immagine, quindi vedo dentro alla picturebox quello che sta dietro alla form(come nell'immagine)
a me servirebbe di fare lo screenshot solo della picturebox per catturare quello che ne viene "mostrato"
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
C'era un metodo che permetteva di catturare porzioni di schermo, ma al momento non riesco proprio a ricordare quale sia o dove si trovi. Nel peggiore dei casi, puoi effettuare una print screen, che ti salva l'immagine nella clipboard, quindi ottenere tutta l'immagine (Clipboard.GetImage) e usare Graphics.DrawImage per trasportarne una parte in un'altra immagine vuota.
Ricorda che le coordinate della PictureBox sono relative al form. Per trasformarle in coordinate assolute relative allo schermo devi usare PictureBox.PointToScreen(New Point(0,0)) (questo restituisce le coordinate del vertice superiore sinistro della picturebox rispetto allo schermo).
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/2010
|
beh grazie per la risposta...
se ti viene in mente il metodo per le porzioni penso sia molto più semplice
perchè io adesso ho usato
Codice sorgente - presumibilmente VB.NET |
Dim p As New Point(0, 0) Dim im As Graphics SendKeys.Send(Chr(Keys.Snapshot)) Threading.Thread.Sleep(700) PictureBox1.PointToScreen(p) im.DrawImage(Clipboard.GetImage, PictureBox1.Location.X, PictureBox1.Location.Y, PictureBox1.Width, PictureBox1.Height)
|
ma non funziona
Ultima modifica effettuata da walker93 il 17/03/2010 alle 23:11 |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
im non è inizializzata, quindi non stai usando nessun oggetto Graphics.
im non è associata ad un'immagine, quindi anche se contenesse un oggetto valido, non produrrebbe alcun output.
PointToScreen è una FUNZIONE, come si legge chiaramento sia dalla documentazione sia dall'intellisense. Tu la stai usando come una procedura. Tutto quello che una funzione fa è produrre un valore, e tu ignori palesemente quel valore, quindi è inutile.
Codice sorgente - presumibilmente VB.NET |
Dim B As New Bitmap(PictureBox1.Width, PictureBox1.Height) Dim im As Graphics = Graphics.FromImage(B) SendKeys.Send(Chr(Keys.Snapshot)) Threading.Thread.Sleep(700) im.DrawImage(Clipboard.GetImage(), New Rectangle(PictureBox1.PointToScreen(New Point(0, 0)), PictureBox1.Size)) im.Flush() ' B dovrebbe contenere parte dello schermo
|
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/2010
|
il tuo codice mi da errore:
System.ArgumentNullException non è stata gestita
Message="Il valore non può essere null. Nome parametro: image"
ho provato con questo:
Codice sorgente - presumibilmente VB.NET |
SendKeys.Send("%{PRTSC}") Application.DoEvents() Dim image As Image = Clipboard.GetImage Dim g As Graphics = Graphics.FromImage(image) PictureBox1.Image = image
|
questo fa bene l'immagine senza errori ma di tutta la form e non della picturebox
come adattarlo alla sola picturebox?
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/2010
|
con questo codice ottengo buoni risultati solo che non appena ridimensiono la form
(e anche la picture box con la prop. anchor) si svuota la picturebox e non riesco a salvarel'immagine
Codice sorgente - presumibilmente VB.NET |
Dim rect As Rectangle Dim image As Image Dim g As Graphics rect = New Rectangle(-5, -20, PictureBox1.Width + 10, PictureBox1.Height + 60) SendKeys.Send("%{PRTSC}") Application.DoEvents() image = Clipboard.GetImage g = Graphics.FromImage(image) g = PictureBox1.CreateGraphics g.DrawImage(image, rect)
|
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Il metodo era Graphics.CopyFromScreen
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/2010
|
oooook
ho usato:
Codice sorgente - presumibilmente Plain Text |
g = PictureBox1.CreateGraphics
g.CopyFromScreen(PictureBox1.PointToScreen(New Point(0, 0)).X, _
PictureBox1.PointToScreen(New Point(0, 0)).Y, _
PictureBox1.PointToScreen(New Point(0, 0)).X + PictureBox1.Width, _
PictureBox1.PointToScreen(New Point(0, 0)).Y + PictureBox1.Height, _
PictureBox1.Size)
|
ma come visualizzarlo nella picturebox??
copyfromscreen non restituisce un valore
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
La seconda coppia di coordinate indica il punto in cui copiare l'immagine. Tu la stai copiando fuori dalla picturebox (ossia con il vertice superiore sinistro coincidente con il vertice inferiore destro della picturebox), e forse per questo non riesci a vederla.
Al massimo disegna l'immagine su una bitmap e poi impostala come immagine nella picturebox.
|
|