2015-05-01 19 views
8

Görüntüleri kesen bir program yapıyorum. İki tane PictureBoxes ve 'kırpma' adlı bir Düğmem var. Bir resim kutusu bir resim içerir ve içinde bir dikdörtgen seçtiğimde ve 'Kırp' düğmesine bastığınızda, seçilen alan diğer fotoğraf kutusunda görünür; Bu yüzden, programa bastığımda program çalışıyor. Sorun şu: Resim alanını görüntü kutusundan resme nasıl alabilirim Image?Dikdörtgenden nasıl görüntü alınır?

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; 

sorun olduğunu x = null ve görüntü resim kutusuna gösteren bu yüzden nasıl Image değişkene bu resim kutusundan Resmi alabilirim edilir?

cevap

3

Birkaç sorunları:

  • Birinci ve en önemlisi: Sen PictureBox.Image (a Mülkiyet) arasındaki ilişki hakkında karıştı ediliyor ve Graphics sen PictureBox 'ın yüzeye ile ilişkilendirmek. Control.CreateGraphics'dan aldığınız Graphics nesnesi yalnızca kontrolün yüzeyine boyayabilir; genellikle ne istediğini değil; Bunu ne zaman ve hatta, genellikle kodunuzu çalışmak görünüyor ederken

nedenle, sadece yüzeye kalıcı olmayan pikseller boyalar .. e.Graphics kullanarak Paint olay bunu yapmak istiyorum. Küçült/maksimize ve kalıcı olmayan ne anlama geldiğini göreceksiniz ..! size Bitmap atayabilirsiniz

g.DrawImage(sourceBitmap, targetArea, sourceArea, GraphicsUnit.Pixel); 

Bundan sonra:

Graphics g = Graphics.FromImage(bmp); 

Şimdi bunu içine çizebilirsiniz:

böyle bir Grahics nesnesi ile ilişkilendirilecek gereken bir Bitmap bmp değiştirmek için Image TargetPicBox Mülkiyetinin Mülkiyeti.

Son olarak Graphics, ya da daha iyisi, bir using yan tümce tümce tümce tümce tümcesinde ..

rectCropArea anlamlı değerler vermeyi başardınız varsayalım.

  • Ayrıca kaynak bit eşlem kopyalamak yolu bir hata var olduğuna dikkat: Tam görüntü istiyorsanız, kullanabilirim onunSize (*), değil PictureBox biri !!

  • Ve aynı hatayla bir hedef dikdörtgen oluşturmak yerine, TargetPicBox.ClientRectangle'u kullanın! İşte

kırpma Düğmesi için bir örnek kod şudur:

// 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; 
Doğru fare olaylarda Dikdörtgen hazırlanmış olması gerekirdi Tabii
  • !
  • Burada sonucun en boy oranında karar vermek istersiniz; muhtemelen sonucu deforme etmek istemezsiniz! Bu yüzden kaynak kırpma dikdörtgenini mi yoksa hedef dikdörtgeni mi genişletip genişletmeyeceğine karar vermelisiniz ..!

Not I atadıklarından o targetBitmapTargetPicBox.Image için sana mecbur asla değil dipose! Bunun yerine, yeni bir Image'u atamadan önce, ilk önce Dispose numaralı telefonu kullanıyorum.

İlgili konular