Der HSV-Farbraum ist ein Farbraum, bei dem man die Farbe mit Hilfe des Farbtons (hue), der Farbsättigung (saturation) und des Hellwerts (value) definiert. Für die Beschreibung der Farbe – genauer dem Farbort – in diesem Farbraum werden folgende Parameter benutzt:
Es gibt nicht nur einen RotGrünBlau-Farbraum oder RGB-Farbraum (Farbwürfel), sondern theoretisch sehr viele. Allen gemeinsam ist die Komposition einer Farbe durch die additive Mischung von Farbanteilen der drei Grundfarben rot, grün und blau. Diese Anteile sind in Gambas jeweils als Ganzzahlwerte im Intervall 0 bis 255 für die 3 Farbanteile codiert.
Im Alpha-Kanal werden zusätzlich zu den Farbinformationen auch Transparenz-Informationen gespeichert. Der Alphakanal umfasst bei Gambas 256 Stufen. Dem Wert Alpha = 255 entspricht 'vollständig transparent' – im Gegensatz zur normalen Farb-Codierung. Alpha = 0 dagegen entspricht 'nicht transparent'.
In den folgenden Abschnitten 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.
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, hexadezimale oder binäre 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, iAlpha 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
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 End
Hier das Ergebnis:
Abbildung 23.4.2.5.1: Farbpalette Grautöne
Es folgt 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
… und so sehen die 216 (6x6x6) Farben aus:
Abbildung 23.4.2.5.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
Im Kapitel 23.4.2.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
Farb-Manipulationen für ein Bild-Pixel 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.
' Gambas class file Public Sub Form_Open() FMain.Center FMain.Resizable = False ColorButton1.Color = Color.White End 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 '-- Verändertes Image wieder in ein Picture umwandeln und in die PictureBox setzen PictureBox1.Picture = hImage.Picture End Public Sub PictureBox1_MouseDown() GetSetPixelColor(Mouse.X, Mouse.Y) End Public Sub PictureBox1_MouseMove() If Mouse.Left = True Then GetSetPixelColor(Mouse.X, Mouse.Y) Endif End Public Sub btnClose_Click() FMain.Close() End
Abbildung 23.4.2.5.3: Originalbild und manipuliertes Bild