2013-06-06 10 views
8

enter image description hereRitaglio i confini di immagine in base al colore in Windows Phone

sopra è l'immagine che sto usando. Quello che sto cercando di ottenere è la rimozione della porzione rossa del bordo dall'immagine. Come posso raggiungere questo programmaticamente con Windows Phone? Ho trovato il metodo WriteableBitmapExtensions.Crop(), ma io sono confuso con gli argomenti

anche un altro problema che sto affrontando è (come posso trovare la x, y posizione dell'immagine, così come le dimensioni e la larghezza?): Otterrò le immagini con bordi di dimensioni diverse, quindi non posso hardcode i valori x o y.
Qualcuno può suggerire una soluzione o guidarmi a risolvere il problema?

+0

è il fotogramma sempre attorno all'intera immagine? Ed è una cornice monocromatica –

+0

sì. L'immagine sarà sempre circondata da un bordo colorato univoco. – StezPet

risposta

3

Questa non è una cosa così banale e non hai condiviso alcun codice con noi, quindi posso darti alcuni suggerimenti. Ogni WriteableBitmap ha larghezza e altezza definite. Si dovrebbe essere in grado di accedervi tramite

wb.PixelWidth; 
wb.PixelHeight; 

dove WB è il tuo WriteableBitmap (foto)

Detto questo, è banale per ritagliare una WriteableBitmap utilizzando biblioteca WriteableBitmapEx

var croppedBmp = wb.Crop(10, 10, 300, 220); 

Se la vostra wb era 320x240 e il bordo era di larghezza 10, quindi la suddetta chiamata di ritaglio farà il trucco: prenderai il rettangolo interno partendo dal punto (10,10) e finendo a (310, 230)

Ora al tuo secondo problema: non conoscendo la larghezza del confine. Sarebbe utile se si sa che

  1. Border è dello stesso spessore su ogni lato del quadro
  2. Border è sempre in un solo colore

Supponendo che sia vero, si potrebbe pensare ad un semplice algoritmo (che non può essere corretto ogni volta, ma è possibile testare e regolare), che avrebbe preso alcuni punti casuali, ad esempio

(0, randNumber < wb.PixelHeight), (randNumber < wb.PixelWidth, 0), (wb.PixelWidth , RandNumber < wb.PixelHeight), (randNumber < wb.PixelWidth, wb.PixelHeight)

e quindi spostare verso l'interno del quadro finché il pixel prossimo è dello stesso colore del pixel di partenza. Più punti prendi a caso, maggiori sono le possibilità che tu abbia ragione. Il problema ovvio con questo è che può accadere che qualcosa sull'immagine sia dello stesso colore del bordo (esattamente lo stesso) che farà sembrare che il bordo sia più largo di quello che realmente è. Ecco perché dovresti prendere più punti.

Se hai mostrato del codice, sarei felice di espandere la risposta.

Problemi correlati