Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Brauche Hilfe beim Code erklären (https://www.delphipraxis.net/152502-brauche-hilfe-beim-code-erklaeren.html)

Berserker89 24. Jun 2010 15:50

Brauche Hilfe beim Code erklären
 
Hallo Delphi-Praxis,
brauche unbedingt eure Hilfe und zwar habe ich eine Klausur verhauen in Delphi und nun soll ich morgen ein Programm, welches ich bekommen habe, vor der Klasse präsentieren und erklären um meine Note zu verbessern. Es handelt sich um ein Programm, welches Texte in einem Bild verstecken soll, die man dann wieder auslesen kann(Bitmanipulation oder Steganographie). Dabei sollen in einer .bmp nur die letzten beiden Bits manipuliert werden. Wir sind 3 Leute und mein Part ist das Verstecken im Bild. Nun habe ich folgenden Code und auch schon einige Kommentare dazu.

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var hoehe, breite, x, y:integer;
    R, G, B, bintext:string;
    farbe:longint;
begin
  breite := form1.image1.Width - 1;
  hoehe := form1.Image1.Height - 1;
  bintext := strtobin(memo1.Text) + '0100000010001001'; //At Promill (abbruchbedingung)
  if length(bintext) mod 3 <> 0 then
  repeat
  bintext := bintext + '0'
  until
  length(bintext) mod 6 = 0;
  if ceil(length(bintext)/ 3) <= form1.Image1.Height * form1.Image1.Width then //überprüfung ob der text in das bild passt
  for y := 0 to hoehe do //schleife um die y-achse durch zu gehen
  begin
    for x := 0 to breite do //schleife um die x-achse durch zu gehen
    begin
      farbe := colortorgb(form1.Image1.Canvas.Pixels[x,y]); //dier farbwerte des aktuellen pixels wird ermittelt
      R := bytetobin(getRvalue(farbe)); //der rot anteil wird herausgefiltert und in eine binärzahl umgewandelt
        R[7] := bintext[1]; //das vorletzte bit wird geändert
        R[8] := bintext[2]; //das letzte bit wird geändert
        delete(bintext, 1, 2); //die geschriebenen bits werden abgeschnitten
      G := bytetobin(getGvalue(farbe)); //der grün anteil wird herausgefiltert und in eine binärzahl umgewandelt
        G[7] := bintext[1]; //das vorletzte bit wird geändert
        G[8] := bintext[2]; //das letzte bit wird geändert
        delete(bintext, 1, 2); //die geschriebenen bits werden abgeschnitten
      B := bytetobin(getBvalue(farbe)); //der blau anteil wird herausgefiltert und in eine binärzahl umgewandelt
        B[7] := bintext[1]; //das vorletzte bit wird geändert
        B[8] := bintext[2]; //das letzte bit wird geändert
        delete(bintext, 1, 2); //die geschriebenen bits werden abgeschnitten
      form1.Image1.Canvas.Pixels[x,y] := rgb(bintobyte(R), bintobyte(G), bintobyte(B)); //die geänderten farbwerte werden gemalt
      if bintext = '' then //wenn keine zeichem mehr vorhanden sind...
      begin
        form2.Visible := false; //ausblenden der texteingabe
        exit; //abbruch der schleifen
      end;
    end;
  end;
end;
Was ich nich verstehe und nicht erklären kann ist wieso bei breite und höhe (-1) ist und den Teil :

Delphi-Quellcode:
  bintext := strtobin(memo1.Text) + '0100000010001001'; //At Promill (abbruchbedingung)
  if length(bintext) mod 3 <> 0 then
  repeat
  bintext := bintext + '0'
  until
  length(bintext) mod 6 = 0;
Wäre echt super nett, wenn jemand mit helfen würde !

s.h.a.r.k 24. Jun 2010 16:06

AW: Brauche Hilfe beim Code erklären
 
Und zwar fängt ein Array der Länge 10 ja beim Index 0 an und hört bei 9 auf, daher das -1. Dann brauchst du es später bei den for-Schleifen nicht mehr machen. Und das Bild selbst ist halt ein zweidimensionales Array.

DeddyH 24. Jun 2010 18:34

AW: Brauche Hilfe beim Code erklären
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1031369)
Und zwar fängt ein Array der Länge 10 ja beim Index 0 an und hört bei 9 auf, daher das -1.

Das gilt zwar nur für dynamische Arrays, aber die Kernaussage stimmt schon. Das linke obere Pixel des Image hat den Index [0,0] und das rechte untere den Index[Width - 1, Height - 1]. Und was verstehst Du am restlichen Code nicht? MOD gibt Dir den Rest bei ganzzahliger Division zurück, d.h. Du kannst damit ermitteln, ob eine Zahl durch eine andere Zahl glatt teilbar ist. Das soll als Hilfe aber genügen ;)

Berserker89 24. Jun 2010 19:36

AW: Brauche Hilfe beim Code erklären
 
Zitat:

Zitat von DeddyH (Beitrag 1031393)
Zitat:

Zitat von s.h.a.r.k (Beitrag 1031369)
Und zwar fängt ein Array der Länge 10 ja beim Index 0 an und hört bei 9 auf, daher das -1.

Das gilt zwar nur für dynamische Arrays, aber die Kernaussage stimmt schon. Das linke obere Pixel des Image hat den Index [0,0] und das rechte untere den Index[Width - 1, Height - 1]. Und was verstehst Du am restlichen Code nicht? MOD gibt Dir den Rest bei ganzzahliger Division zurück, d.h. Du kannst damit ermitteln, ob eine Zahl durch eine andere Zahl glatt teilbar ist. Das soll als Hilfe aber genügen ;)

Vielen Dank für eure Hilfe !
Verstehe noch das mit
Delphi-Quellcode:
bintext := strtobin(memo1.Text) + '0100000010001001'
nicht und wieso macht man denn das mod bzw wozu wird die gerade zahl benötigt?

Teekeks 24. Jun 2010 21:55

AW: Brauche Hilfe beim Code erklären
 
Wenn ich das richtig sehe bedeutet das '0100000010001001' dass dein Text zu ende ist.

SirThornberry 25. Jun 2010 08:31

AW: Brauche Hilfe beim Code erklären
 
Zitat:

nun soll ich morgen ein Programm, welches ich bekommen habe
Zitat:

Nun habe ich folgenden Code und auch schon einige Kommentare dazu.
Wenn einer der anderen aus dem Team den Code verfasst hat wäre es doch das einfachste gewesen denjenigen zu fragen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz