Zitat
Programme:
Records (Strukturen) und das Einsetzen von Unterprogrammen als Prozeduren oder Funktionen sind Ihnen seit der letzten Kurseinheit bekannt. Setzen Sie dieses Wissen nun anhand des folgenden Beispiels um: Angesichts der horrenden Lizenzkosten für professionelle Bildbearbeitungsprogramme sehen Sie sich als Einzelunternehmer/in gezwungen, selbst eine Bildbearbeitungssoftware zu erstellen. Praktischerweise finden Sie in Ihrem Onlinekurs bereits eine fertige Programmbibliothek namens imageLib.dll, die Sie als Referenz in Ihr Projekt integrieren sollen,
Da prinzipiell alle Echtfarbenbilder aus den zu jedem Bildpunkt gehörenden Rot/Grün/Blau- Werten (jeweils zwischen 0 und 255, also Bytes) bestehen, liefert Ihnen diese DLL bereits die folgende Struktur mit (diese Zeilen dienen nur zur Veranschaulichung, Sie müssen nachstehenden Programmcode nicht eintippen):
Structure RGBPixel ' Struktur für Bildpunkt
Dim red As Byte ' Rot-Wert
Dim green As Byte ' Grün-Wert
Dim blue As Byte ' Blau-Wert
End Structure
Als erster Schritt erstellen Sie mit Ihrer Entwicklungsumgebung zunächst eine VB.NET Konsolenanwendung und verweisen in der ersten Zeile auf die Funktionen der DLL-Datei:
Imports imageLib.Jpeg
Imports System
Module Module1
Sub Main()
End Sub
End Module
Im Hauptprogramm - nach Sub Main() - erstellen Sie dann ein Objekt "iml" vom Type image- Lib.Jpeg, um die Bildfunktionen nutzen zu können:
Dim iml As imageLib.Jpeg = New imageLib.Jpeg
Danach deklarieren Sie weiters ein Array namens Bild vom Typ dieser RGBPixel-Struktur mit zwei Dimensionen für Bildbreite und –höhe. Die Anzahl der Bildpunkte pro Dimension bleibt zunächst undefiniert:
Dim Bild(,) As RGBPixel ' leeres zweidimensionales Array für Bild
Um ein JPEG-Bild in ein Bildarray einzulesen, steht Ihnen die Boolean-Funktion iml.laden(Dateiname, Bildarray) zur Verfügung. Gelingt das Einlesen, liefert die Funktion den Wert True zurückt, ist etwas schiefgegangen, wird False zurückgegeben. Beispiel:
If iml.laden("zombie.jpg", Bild) = True Then
Console.WriteLine("Einlesen OK")
...
Hier wird versucht, das JPEG-Bild "zombie.jpg" in das Array Bild (beim Aufruf ohne Klammern angeben) einzulesen, im Erfolgsfall wird True urückgegeben. iml.laden setzt außerdem die jeweiligen Arraydimensionen auf die zutreffende Anzahl an Elementen – die erste Dimension wird auf die Bildbreite (in Pixeln) gesetzt, die zweite Dimension entsprechend auf die Bildhöhe. Ein wichtiger Tipp: um danach die Anzahl der Elemente pro Dimension aus dem Bildarray ermitteln zu können, sollten Sie die Bild.GetLength(Dimension) einsetzen. So liefert Bild.GetLength(0) etwa die Anzahl der Arrayelemente in der ersten Dimension (Breite) und Bild.GetLength(1) die Anzahl der Arrayelemente in der zweiten Dimension (Höhe). Beachten Sie, dass das erste Element eines Arrays aber immer mit dem Index 0 angesprochen wird und das letzte verfügbare daher den Index von GetLength(...) – 1 hat! Der Rot-Wert des Bildpunktes ganz links oben wird daher mit Bild(0,0).red angesprochen, der Grün-Wert des Bildpunktes ganz rechts unten im Bild z.B. mit Bild(Bild.GetLength(0)-1, Bild.GetLength(1)- 1).green.
Mit denselben Parametern steht Ihnen auch die Boolean-Funktion iml.speichern(Dateiname, Bildarray) zur Verfügung, mit der Sie die in einem RGBPixel-Bildarray befindlichen Bilddaten wieder in eine JPEG-Datei zurückschreiben können. Auch diese Funktion liefert True im Erfolgsfall, oder False wenn das Schreiben nicht gelungen ist: Um die im Bildarray "Bild" befindlichen Daten als JPEG-Datei "zombie2.jpg" zurück zu schreiben, verwenden Sie beispielsweise folgenden Aufruf:
' Bilddatei schreiben
If iml.speichern("zombie2.jpg", Bild) = True Then
Console.WriteLine("Schreiben OK")
Else
Console.WriteLine("Fehler beim Schreiben")
End If
Schreiben Sie so ausgestattet jeweils ein Programm, das mit einem von Ihnen angegebenen Bild folgende Bildeffekte ermöglicht und das Ausgabebild wieder unter einem anderen Namen abspeichert:
(1) Scanline-Effekt: jede zweite Bildzeile wird schwarz (RGB-Werte: 0,0,0) eingefärbt.
(2) Vertikal-Spiegeln-Effekt: das Bild wird vertikal auf den Kopf gestellt.
(3) Graustufen-Effekt: die RGB-Werte werden jeweils mit ihrem gemeinsamen Mittelwert eingefärbt. Zur Berechnung des Mittelwertes müssen Sie möglicherweise die R/G/BBytewerte in einen gemeinsamen 32-Bit Integer-Wert konvertieren, wozu Sie System. Convert.ToInt32(Variable) verwenden können. Für die Rück-Konvertierung in einen Byte-Wert steht Ihnen System.Convert.ToByte(Variable) zur Verfügung.
Erweiterung für Informatiker / Informatikmanager (optional für Betriebswirt/innen/e): Implementieren Sie stattdessen die Bildeffekte (1) "90° Rotation", (2) "Weichzeichner" und (3) "Sinuskurven-Verzerrer".
...
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ZXK_Nimo« (10.01.2005, 18:50)