In diesem Kapitel erfahren Sie exemplarisch, wie Sie die Klassen Color (gb.image), Color (gb.qt4) und ImageStat (gb.image) einsetzen, um
Die Reihenfolge der Anwendungen widerspiegelt keine Rangfolge. Farbe und Farbwert werden synonym verwendet.
Folgende Klassen verfügen über die Farb-Eigenschaften Background und Foreground, die Sie auslesen oder setzen können:
Button, ButtonBox, CheckBox, ColorButton, ColorChooser, ColumnView, ComboBox, Container, Control, DateBox, DateChooser, Dial, DirChooser, DirView, DrawingArea, Editor, Embedder, Expander, FMain, FileChooser, FileProperties, FileView, FontChooser, Form, Frame, GridView, HBox, HPanel, HSplit, IconPanel, IconView, ImageView, LCDLabel, LCDNumber, Label, ListBox, ListContainer, ListView, MaskBox, MenuButton, MovieBox, Panel, PictureBox, ProgressBar, RadioButton, ScrollArea, ScrollBar, ScrollView, Separator, SidePanel, Slider, SliderBox, SpinBox, TabPanel, TabStrip, TableView, TextArea, TextBox, TextEdit, TextLabel, ToggleButton, ToolButton, ToolPanel, TrayIcon, TreeView, UserContainer, UserControl, VBox, VPanel, VSplit, ValueBox, Window, Wizard, _IconPanelContainer, _Split, _TabPanelContainer, _TreeView, _WizardContainer.
iColor = ColorButton.Color iColor = PictureBox1.Picture.Image[Mouse.X, Mouse.Y] iColorHex = Hex(Color.Background, 6)
Farben aus den beiden Farbräumen RGB und HSV können Sie unmittelbar zuweisen oder als sichere Eingaben über ColorButton sowie ColorChooser oder den direkten Aufruf des Farbauswahl-Dialogs Dialog.SelectColor(). Genauso zuverlässig ist die Verwendung von Farb-Konstanten. Die Farbwerte (Datentyp Integer) können Sie als dezimale oder hexadezimale Zahl schreiben. Dem hexadezimalen Zahlen-Format ist der Präfix & oder &H oder &h voran zu stellen.
Textarea.Background = Color.SelectedBackground Textarea.Background = &H86ABD9 Textarea.Background = 8825817 Textarea.Background = Color.RGB(134, 171, 217)' » Rot: 86→ 134, Grün: AB→ 171, Blau: D9→ 217 Textarea.Background = Color.HSV(213, 97, 217) iBGColor = Color.RGB(134, 171, 217) ' Farbwert generieren Textarea.Background = iBGColor ' Farbwert zuweisen Textarea.Foreground = Color.Red
Bei Farbanalyse interessieren sowohl der Farbwert als auch die Rot-Grün-Blau-Farbanteile und optional auch der Alpha-Wert. Sie können die Klassen Color (gb.image) und ColorInfo (gb.image) nutzen, um die aufgeführten Farbinformation im interessierenden Farbraum (RGBA und HSVA) zu ermitteln. Setzen Sie die Klasse ColorInfo ein, dann ist es ein guter Plan, mit einem Objekt vom Typ ColorInfo zu arbeiten. Es wird davon ausgegangen, dass die zu analysierende Farbe in der Variablen iColor in der Analyse-Prozedur bereitgestellt wird (→ ColorChooser) und die Farbanteile in iRed, iGreen, IBlue, IHue, iSaturation, iValue sowie iAlpha.
Dim iColor As Integer Dim hColorInfo As ColorInfo Dim iRed, iGreen, iBlue, iHue, iSaturation, iValue As Integer iColor = ColorChooser1.SelectedColor ' Variante 1 im RGB-Farbraum hilft immer ... iRed = CInt(iColor / 256 / 256) Mod 256 iGreen = CInt(iColor / 256) Mod 256 iBlue = iColor Mod 256 ' Variante 2 – Sie nutzen den []-Operator der Color-Klasse iRed = Color[iColor].Red ' Rot-Farbanteil auslesen iGreen = Color[iColor].Green ' Green-Farbanteil auslesen iBlue = Color[iColor].Blue ' Blau-Farbanteil auslesen iAlpha = Color[iColor].Alpha ' Alpha-Wert auslesen iHue = Color[iColor].Hue iSaturation = Color[iColor].Saturation fValue = Color[iColor].Value ' Variante 3 – Klasse ColorInfo hColorInfo = Color[iColor] ' Ein ColorInfo-Objekt wird zurückgegeben iRed = hColorInfo.Red iGreen = hColorInfo.Green iBlue = hColorInfo.Blue iAlpha = hColorInfo.Alpha iHue = hColorInfo.Hue iSaturation = hColorInfo.Saturation fValue = hColorInfo.Value ' Variante 3b ' Möchten Sie keine Variable für hColorInfo anlegen, ist auch die Verwendung von WITH denkbar With Color[iColor] iRed = .Red iRed += 20 ' Auch Zuweisungen funktionieren hier wie erwartet .Red = iRed ' Am Ende kann die veränderte Farbe zugewiesen werden ColorChooser1.SelectedColor = .Color End ' With
Eine Farb-Palette ist eine Auswahl bestimmter Farben aus dem verfügbaren Farbraum. Zwei Farbpaletten und deren Generatoren werden vorgestellt: Palette mit Grautönen und eine Palette websicherer Farben.
Die Palette der Grautöne generieren Sie mit diesem Quelltext, bei der die RGB-Farbanteile stets den gleichen Wert haben:
Public Sub btnSetGrayPalette_Click() Dim panStartX, panX, panY, iRow, iColumn, iCount As Integer Dim pPanel As Panel panStartX = 424 panX = panStartX panY = 16 iCount = 0 For iRow = 1 To 16 For iColumn = 1 To 16 pPanel = New Panel(FMain) pPanel.X = panX pPanel.Y = panY pPanel.H = 12 pPanel.W = 12 pPanel.Background = Color.RGB(iCount, iCount, iCount) panX += 16 Inc iCount Next ' iColumn panX = panStartX panY += 16 Next ' iRow End ' btnSetGrayPalette_Click()
Hier das Ergebnis:
Abbildung 25.3.5.4.1: Farbpalette Grautöne
Hier der Quelltext für die websicheren Farben …
Public Sub btnSetWebFarbPalette_Click() Dim R, G, B, panStartX, panStartY, panX, panY, iCount As Integer Dim pPanel As Panel panX = 16 panStartY = 16 panY = panStartY For R = 0 To 255 Step 51 For G = 0 To 255 Step 51 For B = 0 To 255 Step 51 pPanel = New Panel(FMain) pPanel.X = panX pPanel.Y = panY pPanel.H = 12 pPanel.W = 12 pPanel.Background = Color.RGB(R, G, B) panY += 16 Next ' Blue panY = panStartY panX += 16 Next ' Green panY = panStartY panX += 16 Next ' Red End ' btnSetWebFarbPalette_Click()
… und so sehen die 216 (6x6x6) Farben aus:
Abbildung 25.3.5.4.2: Web-Farb-Palette
Nach http://www.e-teaching.org/ wird 'Farbtiefe' so festgelegt: „Die Farbtiefe gibt an, wie viele unterschiedliche Farbstufen für jeden einzelnen Bildpunkt einer Grafik zur Verfügung stehen. Da die „Feinheit“ der Abstufungen davon abhängt, wie viel Speicherplatz pro Bildpunkt verwendet wird, gibt man die Farbtiefe in Bits an. Mit 8 Bit lassen sich z. B. 256 Farbnuancen für einen Farbkanal unterscheiden. Eine Farbe entsteht dabei durch Mischung mehrere Farbkanäle eines Farbraumes. Bei Computergrafiken wird dabei üblicherweise der RGB -Farbraum verwendet, in dem sich Farben durch additive Mischung der drei Grundfarben Rot, Grün und Blau zusammensetzen.“
Public Sub btnGetDepth_Click() Dim hImageStat As ImageStat hImageStat = ImageStat("Images/color.png") ' Bildpfad Print "Farbtiefe = " & hImageStat.Depth & " Bits" Print "Farbtiefe = " & ImageStat("Images/color.png").Depth & " Bits" ' Klasse ImageStat (gb.image) ' Wechsel der Klasse! Print "Farbtiefe = " & PictureBox1.Picture.Image.Depth & " Bits" ' Klasse Image (gb.image) End ' btnGetDepth_Click()
Im Kapitel 25.3.1 Klassen Color finden Sie weitere Hinweise für das Mischen von Farben sowie deren Veränderung:
Public Sub btnMerge_Click() Dim fWeight As Float fWeight = 0.3 ColorButton3.Color = Color.Merge(ColorButton1.Color, ColorButton2.Color, fWeight) End ' btnMerge_Click()
Mit diesem Quelltext lesen Sie Farbinformationen für ein Bild-Pixel aus und setzen eine neue Farbe für das selektierte Pixel. Die neue Farbe können Sie in einem Farbauswahl-Dialog (ColorButton) festlegen. Das Projekt finden Sie im Download-Bereich.
' Gambas class file Public Sub Form_Open() FMain.Center FMain.Resizable = False ColorButton1.Color = Color.White End ' Form_Open Public Sub GetSetPixelColor(x As Integer, y As Integer) Dim iColor, hColor As Integer Dim hImage As Image ' Print "Mouse.X = " & Mouse.X ' Print "Mouse.Y " & Mouse.Y ' GetPixelColor iColor = PictureBox1.Picture.Image[x, y] ' Print "Aktuelle Pixel-Farbe = " & iColor ' Print "Rot-Anteil = " & Color[iColor].Red ' Print "Grün-Anteil = " & Color[iColor].Green ' Print "Blau-Anteil = " & Color[iColor].Blue ' SetPixelColor ' Konvertieren nach Image, da nur die Image-Klasse den Zugriff auf Pixel gestattet. hImage = PictureBox1.Picture.Image ' Pixel-Farbe setzen -> Block-Pixel aus 9 Pixeln hColor = ColorButton1.Color If x > 1 And y > 1 For i = -1 To 1 For k = -1 To 1 hImage[x + i, y + k] = hColor Next ' k Next ' i Endif ' x > 1 And y > 1 ? ' Verändertes Image wieder in ein Picture umwandeln und in die PictureBox setzen PictureBox1.Picture = hImage.Picture End ' GetSetPixelColor(x As Integer, y As Integer) Public Sub PictureBox1_MouseDown() GetSetPixelColor(Mouse.X, Mouse.Y) End ' PictureBox1_MouseDown() Public Sub PictureBox1_MouseMove() If Mouse.Left = True Then GetSetPixelColor(Mouse.X, Mouse.Y) Endif ' Mouse.Left = True ? End ' PictureBox1_MouseMove() Public Sub btnClose_Click() FMain.Close End ' btnClose_Click()
Sie können mit einem Mausklick ein Pixel – genauer ein Blockpixel aus 9 einzelnen Pixeln – umfärben (grüne Punkte), wobei das Block-Pixel nur den Effekt hervorheben soll. Mit gedrückter linker Maustaste können Sie auf dem Bild mit einem 3Pixelx3Pixel-Pinsel malen (gelbe Linie). Sie können sich die (absoluten) Maus-Koordinaten (bezogen auf die PictureBox) und die Farbinformationen des Originalpixels in der Konsole ausgeben lassen.
Abbildung 25.3.5.7.1: Originalbild und manipuliertes Bild