Autor Beitrag
xBullet89x
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 02.03.08 21:37 
Hallo Leute

Muss mich in einem Schulprojekt um Steganographie in Bitmaps kümmern. Zuerst hatte ich die Idee, über die Delpi komponente TImage (TBitmap) jeden Pixel einzel durchzulaufen um an die Farbwerte zu gelangen, bei Bildern mit einer hohen Auflösung ist dies aber sehr zeitaufwändig.

Nach einigen überlegen kam ich auf die Idee die Bitmap als Datei einzulesen.Der Aufbau von Bitmaps ist mir bekannt, also wo die Bilddaten zu finden sind etc.

Jedoch habe ich sehr große schwierigkeiten beim programmieren und komme irgendwie gar nicht zurecht^^

gut mit den beiden funktionen hatte ich vor zu arbeiten

Aber was muss BmpFile für ein Dateityp sein? Einfach nur File? Dann kann ich aber nicht Read und Write benutzen oder? Oder kann ich ein File of byte nehmen? Bin im moment ziemlich verwirrt^^

AssignFile(BmpFile,Path);
Reset(BmpFile);

Hoffe ihr könnt mir helfen xD
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 764
Erhaltene Danke: 127



BeitragVerfasst: So 02.03.08 21:56 
Anderer Vorschlag: Versuche mal den Zugriff mit Scanline. Der geht schneller als der Pixel-Zugriff.

ub60
xBullet89x Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 04.03.08 15:04 
Hi, danke für deine Antwort!


Also ich benutze jetzt untypisiserte Dateien (File) und lese mit BlockRead die Daten in eine Variable ein, das ist kein Problem, nun wolte ich fragen ob es möglich ist, ab einer bestimmten bytePosition in der Datei mit dem Einleseb zu starten?
Weil ich will ja nur an die eigentlichen Bilddaten ran, vorher befinden sich ja noch File-Header, InfoBlock ^^. Da ich immer mit dme gleichen Bild arbeiten kann (gleiche farbtiefe etc) weiß ich ja, wo die Bilddaten beginnen. zB Ab dem byte 55 stehen die bilddaten...


würde mich über eine kurze antwort freuen!
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 764
Erhaltene Danke: 127



BeitragVerfasst: Mi 05.03.08 00:20 
Versuche es mal mit SEEK. ANsonsten kannst Du doch auch die ersten paar Byte lesen, ohne etwas damit zu tun.

ub60
xBullet89x Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 05.03.08 16:27 
Denkfehler meiner Seits ^^

Ich muss natürlcih alle Daten einlesen und nicht nur die Bilddatem, da ich die Daten ja in eine neue Datei schreibe. Ansonsten würden ja Siognatur /Auflösung etc alles nicht in der neuen Datei stehen und man könnte sie gar nicht öffnen.

Lese jetzt immer 1024Byte in ein Array of Byte ein da kann ich dann ja ganz einfach über den Index zB zum 52. Byte springen^^


Hab noch ne Frage^^ :

Also hab nen Buffer: Array [1..1023] of Byte

Wie kann ich jetzt die einzelnen bytes manipulieren? Kann ja über den Idnex auf jedes einzelne zugreifen.

Gibt es eine Methode um auf die einzelnen Bit zuzugreifen? Ähnlich des Indexes in einem Array?
Will immer das letze Bit ändern...
nagel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: Mi 05.03.08 18:38 
Guckst du hier.
xBullet89x Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 05.03.08 20:54 
Hatte ich mir schon durchgelesen aber irgendwie nicht ganz gecheckt -.-
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 05.03.08 21:18 
Warum machst du dir das denn so elendig schwehr!
Dann kommt dir mal ein Bild vor die Nase das eine Farbauflösung hat die du nicht kennst und fertig ist der Salat.
Außerden geht es über ein Bitmap viel unkomplizierter einzulesen.
Das einzige was du beachten musst ist das Pixelformat. Hier im Beispiel wird es einfach auf 24 Bit (RGB, je 8 Bit) gesetzt.
Wenn du es zum Speichern wieder auf ein anderes Format setzt geht dir womöglich Bildinformation verloren.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure DoIt;
var
  bmp: TBitmap; // unit graphics
  y,x: integer;
  line: PByteArray;

begin
  bmp := TBitmap.Create;
  bmp.LoadFromFile('Deine Datei');
  bmp.PixelFormat := pf24Bit; // damit ist immer klar wie die daten aussehen
  for y := 0 to bmp.Height-1 do
  begin
    line := bmp.ScanLine[y];
    for x := 0 to bmp.Width-1 do
    begin
      //line[x*3+0]  // blau
      //line[x*3+1]  // grün
      //line[x*3+2]  // rot
    end;
  end;
  bmp.Free;
end;

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
xBullet89x Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 05.03.08 21:43 
Hey danke für die Antworten.


Vorgabe war nun mal das die Datei binär eingelesen werden soll ^^

Muss nur mit 24Bit Bitmaps Funktionieren!

Hab jetzzt mal was versucht.

Idee: Hab in einem String viele Nullen und Einsen stehen (Ergeben übern ASCII das Wort Steganographie)

Und dann lade ich immer 1024Bytes aus der Datei und möchte dann von jedem Byte [Nur Bilddaten] das LSB verändern und zwar sodass wenn man die LSB's der Bytes nimmt, die Nullen und Einser folge aus dem String erhält.


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
 ByteI:=54;
    while eOf(BmpFile)<> true do       // So Lange das Ende der Datei nicht erreicht ist, mache...
    begin
      BlockRead(BmpFile,Buffer[0],SizeOf(Buffer),ResultRead);       //Ab der Stelle Buffer[0] Werden 1024 Bytes eingelesen
      if(MessageI <= MessageL) then
      begin
        while (ByteI) <= (ResultRead) DO                //Durchlaufen bis zum 1024 gespeicherten Bytes
        begin
         if (Buffer[ByteI] and (1 shl 0)) = (1 shl 0then //Fehler     //Wenn LSB = 1 dann...
          begin
            if (StrToInt(MessageT[MessageI]) = 0then    //Prüfe ob es 0 ist
            begin
              Buffer[ByteI]:=(Buffer[ByteI] shr 0);
              Buffer[ByteI]:=(Buffer[ByteI] shl 0);
            end;
          end;

          if (Buffer[ByteI] and (0 shl 0)) <= (0 shl 0then     //Wenn LSB = 0 ist dann..
          begin
            if(StrToInt(MessageT[MessageI]) = 1then     // Prüfe ob Bit =1 ist
            begin
              Buffer[ByteI]:=Buffer[ByteI] or (1 shl 0);
            end;
          end;
          inc(ByteI);
          inc(MessageI);
        end;
        ByteI:=0;
      end;
      //Schreiben der Bytes [Manipuliert]
      BlockWrite(f     ,Buffer[0],ResultRead,    ResultWrite);     //Ab der Stelle Buffer[0] Werden 1024 Bytes geschrieben
    end;


So hab heute wieder was drann weiter gemacht und an den schleifen Bedingungen gearbeitet.
Doch nun kommmt in der Zeile 9 der Fehler das [Dann kommt so ein komisches Rechteck in ' '] kein gültiger IntegerWert ist.Ich frage mich wo dieses Ding herkommt -.- Kann mir da einer helfen?

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
xBullet89x Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 06.03.08 23:26 
Hat denn keiner von euch ne Idee?

Oder irgendwas zu meinem code zu sagen? ^^
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 06.03.08 23:50 
Moin!

user profile iconxBullet89x hat folgendes geschrieben:
Oder irgendwas zu meinem code zu sagen? ^^
Doch, haben wir ja auch schon: er ist unnötig kompliziert und nicht allgemeingültig. :zwinker: Entsprechende Vorschläge, wie man das schnell, einfach, elegant und funktional machen könnte (Bitmap von der API laden lassen und Pixelformat 24Bit erzwingen) willst du ja nicht hören... :nixweiss: So könntest du dich mal besser mit der Steganographie befassen (worum es ja wohl eigentlich gehen sollte) und aufhören, an den Bits in der Datei zu fummeln... :roll:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
xBullet89x Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 07.03.08 14:48 
Gut wenn ihr das hier so seht, dann schließt bitte mein Thema.