Autor |
Beitrag |
xBullet89x
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: So 02.03.08 21:56
Anderer Vorschlag: Versuche mal den Zugriff mit Scanline. Der geht schneller als der Pixel-Zugriff.
ub60
|
|
xBullet89x 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Mi 05.03.08 18:38
|
|
xBullet89x 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 05.03.08 20:54
Hatte ich mir schon durchgelesen aber irgendwie nicht ganz gecheckt -.-
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: 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.
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; y,x: integer; line: PByteArray;
begin bmp := TBitmap.Create; bmp.LoadFromFile('Deine Datei'); bmp.PixelFormat := pf24Bit; for y := 0 to bmp.Height-1 do begin line := bmp.ScanLine[y]; for x := 0 to bmp.Width-1 do begin 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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.
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 begin BlockRead(BmpFile,Buffer[0],SizeOf(Buffer),ResultRead); if(MessageI <= MessageL) then begin while (ByteI) <= (ResultRead) DO begin if (Buffer[ByteI] and (1 shl 0)) = (1 shl 0) then begin if (StrToInt(MessageT[MessageI]) = 0) then begin Buffer[ByteI]:=(Buffer[ByteI] shr 0); Buffer[ByteI]:=(Buffer[ByteI] shl 0); end; end;
if (Buffer[ByteI] and (0 shl 0)) <= (0 shl 0) then begin if(StrToInt(MessageT[MessageI]) = 1) then begin Buffer[ByteI]:=Buffer[ByteI] or (1 shl 0); end; end; inc(ByteI); inc(MessageI); end; ByteI:=0; end; BlockWrite(f ,Buffer[0],ResultRead, ResultWrite); 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 Narses: Code- durch Delphi-Tags ersetzt
|
|
xBullet89x 
Hält's aus hier
Beiträge: 7
|
Verfasst: Do 06.03.08 23:26
Hat denn keiner von euch ne Idee?
Oder irgendwas zu meinem code zu sagen? ^^
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 06.03.08 23:50
Moin!
xBullet89x 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.  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...  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...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
xBullet89x 
Hält's aus hier
Beiträge: 7
|
Verfasst: Fr 07.03.08 14:48
Gut wenn ihr das hier so seht, dann schließt bitte mein Thema.
|
|