Un paio di problemi:
- primo e più importante: Stai per essere confuso circa la relazione tra
PictureBox.Image
(una proprietà) e il Graphics
si associa con s' il PictureBox
superficie. L'oggetto Graphics
che si ottiene da Control.CreateGraphics
è in grado solo di dipingere sulla superficie del controllo; di solito non è quello che vuoi; e anche quando lo si fa, di solito si vuole farlo in un evento Paint
utilizzando e.Graphics
..
Così, mentre il codice sembra al lavoro, dipinge solo pixel non persistenti sulla superficie. Riduci a icona/ingrandisci e vedrai cosa significa non persistente ..!
Per cambiare un Bitmap
BMP è necessario associarlo a un oggetto Grahics
come questo:
Graphics g = Graphics.FromImage(bmp);
Ora è possibile disegnare in essa:
g.DrawImage(sourceBitmap, targetArea, sourceArea, GraphicsUnit.Pixel);
Dopo di che è possibile assegnare il Bitmap
a il Image
Proprietà dello TargetPicBox
..
Infine smaltire lo Graphics
, o meglio, metterlo in una clausola using
..
Suppongo che tu sia riuscito a fornire i valori significativi rectCropArea
.
Si noti inoltre che il modo in cui si copia il bitmap di origine contiene un errore: se si desidera che l'immagine completa, non utilizzare suaSize
(*), non quello del PictureBox
!!
E invece di creare un rettangolo di destinazione, con lo stesso errore, utilizzare semplicemente lo TargetPicBox.ClientRectangle
!
Ecco un codice di esempio per il pulsante raccolto:
// a Rectangle for testing
Rectangle rectCropArea = new Rectangle(22,22,55,99);
// see the note below about the aspect ratios of the two rectangles!!
Rectangle targetRect = TargetPicBox.ClientRectangle;
Bitmap targetBitmap = new Bitmap(targetRect.Width, targetRect.Height);
using (Bitmap sourceBitmap = new Bitmap(SrcPicBox.Image,
SrcPicBox.Image.Width, SrcPicBox.Image.Height))
using (Graphics g = Graphics.FromImage(targetBitmap))
g.DrawImage(sourceBitmap, targetRect, rectCropArea, GraphicsUnit.Pixel);
if (TargetPicBox.Image != null) TargetPicBox.Dispose();
TargetPicBox.Image = targetBitmap;
- Ovviamente si deve aver preparato il rettangolo negli eventi del mouse corretta!
- Qui si vorrebbe decidere le proporzioni del risultato; probabilmente non vuoi distorcere il risultato! Quindi è necessario decidere se ritagliare il rettangolo di ritaglio sorgente o se espandere il rettangolo di destinazione ..!
Nota che, dal momento assegno targetBitmap
-TargetPicBox.Image
devo non dipose di esso! Invece, prima di assegnare un nuovo Image
, io prima il Dispose
il vecchio ..