2015-05-01 15 views
8

Sto creando un programma che ritaglia le immagini. Ho due PictureBoxes e un pulsante chiamato 'ritaglio'. Una casella immagine contiene un'immagine e quando seleziono un rettangolo al suo interno e premo 'Ritaglia' l'area selezionata appare nell'altra finestra immagine; quindi il programma funziona quando premo il ritaglio. Il problema è: come posso ottenere l'immagine dall'area di ritaglio nella casella immagine Immagine?Come ottenere un'immagine da un rettangolo?

Rectangle rectCropArea; 
Image srcImage = null; 

TargetPicBox.Refresh(); 
//Prepare a new Bitmap on which the cropped image will be drawn 
Bitmap sourceBitmap = new Bitmap(SrcPicBox.Image, SrcPicBox.Width, SrcPicBox.Height); 
Graphics g = TargetPicBox.CreateGraphics(); 

g.DrawImage(sourceBitmap, new Rectangle(0, 0, TargetPicBox.Width, TargetPicBox.Height), 
rectCropArea, GraphicsUnit.Pixel); 

//Good practice to dispose the System.Drawing objects when not in use. 
sourceBitmap.Dispose(); 

Image x = TargetPicBox.Image; 

Il problema è che x = null e l'immagine sta mostrando nella casella di immagine così come posso ottenere l'immagine da questa casella di immagine nella variabile Image?

risposta

3

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 PictureBoxsuperficie. 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 ..

Problemi correlati