Autor Beitrag
Luzifer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

WinXP Pro/ Vista
D5 Enterprise/D7 Enterprise/D2005 Architect
BeitragVerfasst: Di 08.11.05 15:37 
Hi leute

Es geht um das P4-Format (*.pbm = PortableBitmap). in diesem Format sind die Informationen wie in vielen anderen gängigen Formaten gespeichert. Immer 8 Pixel zusammen, als Bits in ein Byte, dieses wird dann mit einem Ascii-Zeichen dargestellt...... Mein Problem ist folgendes: Wie kann ich diese Bytes so auseinander nehmen, dass ich wieder meine schönen 1en und 0en hab? Ich dachte schon an die Shiftright bzw -left-Funktion, aber ich weiß nicht ob die hierbei funktioniert........

_________________
Never touch a running system
ähM_Key
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 88

Windows XP Professional
D7 Enterprise
BeitragVerfasst: Di 08.11.05 17:10 
Hi!

Mach's doch per Hand; also erst probieren ob das Byte durch 128=2^7 zu teilen geht, bzw. der Rest größer eins ist. Wenn ja, dann ist das erste (bzw. 8.) Bit eine 1, wenn nein eine 0 usw...

Grüße; ähM_Key

_________________
Alles geht ni! Aber ein bissl' was muss!
Luzifer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

WinXP Pro/ Vista
D5 Enterprise/D7 Enterprise/D2005 Architect
BeitragVerfasst: Di 08.11.05 17:17 
hmm das problem dabei ist folgendes: die Daten stehen ungefähr so in der Datei:

ausblenden Delphi-Quelltext
1:
Ë:å					


dabei repräsentiert jedes dieser Zeichen ein Byte, also 8 bits und damit 8 pixel.....

nun möchte ich gerne aus diesen Zeichen die entsprechenden werte im 2ersystem haben, also aus

ñ soll zB 00101101 werden, damit ich das darstellen kann. 0=weiß, 1=schwarz
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 08.11.05 17:26 
Hallo!

Wenn ein Pixel von nur einem Bit repräsentiert wird, kannst du doch tatsächlich nur zwei Zustände abbilden (also bspw. schwarz oder weiß, Grautöne aber nicht). Ist das wirklich so in dem Format?

Wenn´s so ist, nutze diese Funktion, um die einzelnen Bits auszulesen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
Function BitOfByte(Index:Integer; B:Byte):Boolean;
begin
  Result:=(B and (1 shl Index))>0;
end;


Cu,
Udontknow


Zuletzt bearbeitet von Udontknow am Di 08.11.05 17:52, insgesamt 1-mal bearbeitet
Luzifer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

WinXP Pro/ Vista
D5 Enterprise/D7 Enterprise/D2005 Architect
BeitragVerfasst: Di 08.11.05 17:37 
user profile iconUdontknow hat folgendes geschrieben:
Hallo!

Wenn ein Pixel von nur einem Bit repräsentiert wird, kannst du doch tatsächlich nur zwei Zustände abbilden (also bspw. schwarz oder weiß, Grautöne aber nicht). Ist das wirklich so in dem Format?


ja...... leider....

user profile iconUdontknow hat folgendes geschrieben:

Wenn´s so ist, nutze diese Funktion, um die einzelnen Bits auszulesen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
Function BitOfByte(Index:Integer; B:Byte):Boolean;
begin
  Result:=B and (1 shl Index);
end;


Cu,
Udontknow


thx, aber ein/zwei Fragen hab ich natürlich noch ;)

"B" ist nen Char, richtig? und wieso steht da ne "1" vor dem shl? müsste das nicht eigentlich "B" oder das Byte stehen?
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 08.11.05 17:55 
Hallo!

Habe noch eine Kleinigkeit korrigiert (siehe oben).

Der Teil "1 shl Index" ergibt eine Suchmaske. "1" ist im Endeffekt der Bytewert "00000001". Aus "1 shl 6" wird dann "01000000". Dieses Ergebnis wird mit einer binären AND-Operation auf das zu untersuchende Byte verknüpft:

ausblenden Quelltext
1:
2:
3:
Byte   11000100
Mask   01000000
Result 01000000


Ist das Ergebnis größer als 0, so ist das im Index angegebene Bit gesetzt, die Ausgabe ist True.

Cu,
Udontknow
Luzifer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

WinXP Pro/ Vista
D5 Enterprise/D7 Enterprise/D2005 Architect
BeitragVerfasst: Di 08.11.05 18:03 
ahhhh! beim 7. mal lesen hab ichs dann auch verstanden...... *werlesenkannistklarimvorteil*

zumindest größtenteils..... ich frag mich noch was das "and" genau macht...

und müsste das nicht immer größer als null sein wenn ich zB ein Byte habe das so aussieht: 11111111 und ich beispielsweise die 3. stelle überprüfen will?
Der Blaue Gott Balmung
Hält's aus hier
Beiträge: 13

WinXP

BeitragVerfasst: Di 08.11.05 18:24 
Hi,

user profile iconLuzifer hat folgendes geschrieben:
ich frag mich noch was das "and" genau macht...

und müsste das nicht immer größer als null sein wenn ich zB ein Byte habe das so aussieht: 11111111 und ich beispielsweise die 3. stelle überprüfen will?



And soll die zwei Bytes "verknüpfen":
Wenn man die Bytes untereinanderschreibt, ergibt diese Verknüpfung bei zwei übereinanderstehenden Nullen 0, bei einer Null unter oder über einer eins auch 0 und bei zwei Einsen 1.
Mit der Funktion soll geprüft werden, ob an einem bestimmten Index eine 1 steht.

Die Antwort auf deine Frage lautet demnach ja, weil an der dritte Stelle von 11111111 eine 1 steht, was ja bekanntlich größer als 0 ist ;)
Allerdings kann nur True und False zurückgegeben werden.
Luzifer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

WinXP Pro/ Vista
D5 Enterprise/D7 Enterprise/D2005 Architect
BeitragVerfasst: Di 08.11.05 18:30 
sehr gut danke euch!!!!!
Luzifer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

WinXP Pro/ Vista
D5 Enterprise/D7 Enterprise/D2005 Architect
BeitragVerfasst: Di 08.11.05 18:45 
nur eine einzig kleine Frage hab ich noch ;)

gibt es einen Befehl like IntToStr für ByteToBinär??