Sie sind nicht angemeldet.

  • Anmelden

ZXK_Nimo

Fortgeschrittener

  • »ZXK_Nimo« ist der Autor dieses Themas

Beiträge: 422

Wohnort: Klagenfurt

Beruf: AUT

  • Nachricht senden

1

10.01.2005, 18:49

VB.Net / SharpDevelop

Kennt sich jemand damit aus?

Soll in Info ein Programm schreiben mit dem man ein Bild bearbeiten kann ( Scanline Effekt, Vertikal Spiegeln und Grausstufen Effekt) und grad mal überhaupt keine Plan wie ich ein Bild einlesen kann;)

Hier die Angabe

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".
...



Ja, also die .dll Datei hab ich mittlerweile einbinden können, aber dannach is auch schon ende ;) Hab mal das ganze Zeug abgetippt, mir ein Bild ausgesucht und wollts dann eben in die BildArray einlesen, klappt aber nicht, kommt nur (trotzt Kompiler 0 Fehler anzeige) ein Error.

Also wenn mir jemand erklären könnte wie ich es schaffe ein Bild soweit einzulesen, dass ich dann mit den Codes für die eigentliche Aufgaben stellung anfangen kann wäre ich sehr dankbar. Das dannach dürfte ja net mehr so schwer sein ... (denk ich mal hehe)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ZXK_Nimo« (10.01.2005, 18:50)