Επαναχρωματισμός εικόνας bitmap

Στο παράδειγμα που ακολουθεί, επαναχρωματίζουμε τα ροζ pixels της εικόνας σε μπλε. Για το σκοπό αυτό, κάνουμε χρήση της μεθόδου SetPixel, της κλάσης Bitmap. Επίσης, η μέθοδος GetPixel λαμβάνει το τρέχον χρώμα ενός pixel της εικόνας. Η λογική είναι απλή: Διατρέχουμε pixel προς pixel όλη την εικόνα και όπου συναντούμε pixel χρώματος ροζ το αλλάζουμε σε μπλε.

Στην παρακάτω εικόνα, βλέπουμε την πρωτότυπη και την τροποποιημένη έκδοσή της.  

http://users.sch.gr/mouratx/VB-NET_Tips/Graphics/Images/ColoringBitmap.gif

Ο κώδικας τοποθετείται στη ρουτίνα OnPaint της φόρμας :

Protected Overrides Sub OnPaint(ByVal e As _

 System.Windows.Forms.PaintEventArgs)

 

MyBase.OnPaint(e)

 

'ΠΡΩΤΟΤΥΠΗ ΕΙΚΟΝΑ.
'Φόρτωσε την εικόνα στο αντικείμενο.
Dim myBitmap As New Bitmap("GDI+ picture.png")

'Καθόρισε την περιοχή εμφάνισης της εικόνας.
'Ανω αριστερή γωνία στο σημείο (10,10)
'με πλάτος 200 και ύψος 120 pixels.
Dim rectBitmap As New Rectangle(10, 10, 200, 120)

'Εμφάνισέ την στην καθορισμένη περιοχή.
e.Graphics.DrawImage(myBitmap, rectBitmap)

'ΑΛΛΑΓΗ ΧΡΩΜΑΤΙΣΜΟΥ ΤΩΝ ΡΟΖ PIXELS ΣΕ ΜΠΛΕ.
'Όρισε ένα αντίγραφο της πρωτότυπης.
Dim myBitmapClone As Bitmap = myBitmap.Clone

'Πού θα εμφανιστεί.
Dim rectClone As New Rectangle(10, 150, 200, 120)

'Πάρε το χρώμα του Pixel στη θέση (1,1).
Dim clrBack As Color = myBitmapClone.GetPixel(1, 1)

'Νέο back χρώμα το μπλε - με alpha value το άσπρο.
Dim clrNewBack As Color = Color.FromArgb(255, 0, 0, 255)

'Αλλαξε το χρώμα όλων των ροζ pixels σε μπλε.
Dim clr As Color
Dim x%, y%

For x = 0 To myBitmapClone.Width - 1

For y = 0 To myBitmapClone.Height - 1

'Πάρε το back χρώμα του pixel στη θέση (x,y).
clr = myBitmapClone.GetPixel(x, y)

'Αν είναι ίδιο με το background χρώμα...
If clr.Equals(clrBack) Then

Try

'τότε άλλαξέ το σε μπλε.
'Μόνο για non index-based format bitmaps!...
myBitmapClone.SetPixel(x, y, clrNewBack)

Catch

'…αλλιώς run-time error.
MsgBox(Err.GetException.Message)

End Try

End If

Next

Next

'Σχεδίασέ την με το νέο background χρώμα.
e.Graphics.DrawImage(myBitmapClone, rectClone)

'Καθάρισε.
myBitmap.Dispose() : myBitmapClone.Dispose()
rectBitmap = Nothing : rectClone = Nothing

End Sub

 

Να σημειωθεί ότι η μέθοδος SetPixel λειτουργεί μόνο για εικόνες με βάθος χρώματος μεγαλύτερο των 8 bit (JPEG, PNG κλπ, όχι GIF). .

 

·        Χρήστος Μουρατίδης