# Bild in Hex oder Dezimal konvertieren ?



## vbspeed (17. Dezember 2004)

Hallo ich bin neu hier 
und brauche dringend hilfe,

Ich bin dankbar für alle: Tipps,Codeschnipsel,Ganzen Routinen,Links zu Homepages
die sowas machen,...

---------------------------------------------- 
Ich möchte ein Monochromes Bild (Bitmap,Gif,...) 
In Dezimal oder Hexadezimal konvertieren und 
ausgeben.

Das daraus resultierende Programm sollte dann ungefär so funktionieren:
Ich lade ein monochromes Bild (Schwarz/weiss) z.B. 240x128 in eine Picture box
oder so. Dann soll das Programm in der linken oberen ecke anfangen die 
ersten 8 Pixel in der ersten zeile des bildes einzulesen. NAchdem es
dieß getan hat soll es diese pixel in einen binärstring umwandeln. wobei schwarze
pixel eine 1 ergeben und weisse pixel eine 0.
----------
*Beispiel:*
# = Schwarz
+ = weiss

Erste 8 Pixel des Bildes: ##+#++#+
Konvertiert in den binärstring: 11010010
----------
Dann soll das Programm diesen binärstring in
eine dezimal oder hexadezimale zahl umwandeln und in einer
textbox ausgeben. Am ende einer dezimal oder hex zahl muss immer
ein "," stehen´also so --> 255,213,87,....(A2,FF,...)

Hat das programm die letzten 8 Pixel der ersten bildzeile eingelesen und konvertiert
soll es in die nächste Zeile springen und weiter konvertieren. Dabei soll es 
die konvertierten hex oder Dezimal zahlen nicht neben die zahlen von der
ersten bildzeile in die textbox schreiben sonder darunter. und das geht immer so weiter
bis das Programm die letzten 8 Pixel am ende der 128. Bildzeile konvertiert
und in die Textbox geschrieben hat.

Dann soll das programm aufhören.

_Im endeffekt sollte eine zeile in der textbox ungefär so aussehen:_
Dezimal:
192,0,7,222,7,240,120,120,123,135,248,120,0,0,15,7,131,192,0,0

Hexadezimal:
0xFF,0xFF,0x81,0xFF,0xFF,0x8F,0xFF,0xFC,0x07,0xFF,0xFF,0xFF

---------------------------------

Mfg. VbSpeed


----------



## Shakie (18. Dezember 2004)

> Im endeffekt sollte eine zeile in der textbox ungefär so aussehen:
> Dezimal:
> 192,0,7,222,7,240,120,120,123,135,248,120,0,0,15,7,131,192,0,0


Mal 'ne Frage: Wenn du nur schwarze und weiße Pixel hast, wie kannst du dann mehr als zwei verschiedene Dezimalwerte bekommen?

Die Pixel deines Bildes kannst du am besten mit der API-Funktion GetPixel auslesen. Link (Ich finde grad kein besseres Tutorial zu der API aber Google hilft da sicher weiter)

Zum Wandeln von Dezimalzahlen in Hexadezimal gibt es hier ein Tutorial: Link


----------



## vbspeed (18. Dezember 2004)

@Shakie

Ja das hab ich doch oben schon beschrieben 

Aber hier nochmal: Das sind immer 8 Pixel
die nebeneinander sind. und die in einen 8 Bit breiten
binärstring umgewandelt werden, und der binärstring
wird dann in hex oder dezimal konvertiert und ausgegeben.

Aber trotzdem danke für deine hlfe. 

Die Links sind gut Danke.

Mfg. VbSpeed


----------



## Tobias Menzel (18. Dezember 2004)

Mal ne Frage: Monochrome Bilddateien sind auch byteweise codiert (1 Byte ergibt 8 Pixel). Wieso liest Du die Bilddatei nicht einfach byteweise ein (und überspringst dabei den Header) - dann ersparst Du Dir doch den Umweg über getPixel usw.?

Gruß
.


----------



## vbspeed (18. Dezember 2004)

@Datic

Hm tja so git kenne ich mich mit VB noch nicht
aus wie mache ich das denn am besten 
Gibt's da spezielle routinen für 

Mfg. VbSpeed


----------



## vbspeed (19. Dezember 2004)

Hatt denn sonst keiner ne Idee
wia man das bewerkstelligen kann 

Mfg. VbSpeed


----------



## Shakie (19. Dezember 2004)

Schau du machst das so: du benutzt wie schon gesagt die GetPixel API und schreibst dann immer 8 Ergebnisse als 1 oder 0 zusammen. Dann suchst du dir mittels Google eine Funktion zum Wandeln von Binärstrings in eine Dezialzahl oder strengst dein Köpfchen an und denkst drüber nach, wie das in der 6. Klasse (da hab ich es zumindestens gelernt) mit dem Binärsystem war. Und dann benutzt du diese Funktionen zum Wandeln in Hex.
Für VB-Anfänger gilt Grundsätzlich: Google ist dein bester Freund.


----------



## vbspeed (19. Dezember 2004)

@Shakie
Ja ich saß schon gestern dran und habs probiert
aber es wollte und wollte nicht, naja egal ich probiers
weiterhin Danke.
Google ist nicht nur für anfänger der beste Freund 

Mfg. VbSpeed


----------



## vbspeed (20. Dezember 2004)

OK, soweit sogut

Also ich habe es jetzt geschafft die Pixel auszulesen
und in einer Textbox in 8 bit blöcken darzustellen.

Das ganze geht bis jetzt aber nur wenn ich über die einzelnen Pixel
mit der maus drüberfahre (Mouse Move). Wie kann ich das jetzt
machen das es von selber pixel für pixel ausliest und am ende der 
Zeile in die nächste zeile springt ? Irgendwie mit X und Y aber wie 

Hat jemand nen tipp oder weiß wie sowas geht 

Mfg. VbSpeed


----------



## vbspeed (20. Dezember 2004)

Hy,

Ich hab das was mit CurrentX und CurrentY bei der PictureBox
gefunden ist das was  Was kann ich damit machen 

Mfg. VbSpeed


----------



## vbspeed (21. Dezember 2004)

Also ich kann ds jetzt so amchen wie ichdas will aber ich habe noch
folgendes problem:

Ich kann die Pixel nur auslesen wenn ich mit der Maus 
drüberfahre.

Wie kann ich es anstellen das das programm automatisch
immer um ein Pixel weitergeht 

Mfg. VbSpeed


----------



## Shakie (21. Dezember 2004)

Du machst dir zwei schleifen:
	
	
	



```
Dim X as Integer
Dim Y as Integer
 
 
 


For Y=1 To 64 '64 ist hier die Anzahl der Pixel in der Höhe deines BildesFor X=1 To 64 '64 ist hier die Anzahl der Pixel in der Breite deines BildesPixelAuslesen (X,Y) 'statt PixelAuslesen schreibst du deine Funktion zum Auslesen des Pixels hin.


Next

 

Next
```

Du musst allerdings beachten, dass X und Y nun als Pixelnummer zu verstehen sind und nicht die Koordinaten auf der PictureBox sind. Deshalb musst du evtl. "ScaleMode" auf "Pixel" stellen oder X,Y noch in Twips umrechnen (1 Millimeter = 56.7 Twips)


----------



## vbspeed (21. Dezember 2004)

Hy,
Alles funktioniert aber es ist so langsam.
Ich hab das ganze in einen Timer getan
aber das braucht ewig für ein bild das
240x128 Pixel groß ist. 

Wie kann i8ch das beschleunigen auf ein paar sekunden oder
sogar millisekunden 

Weiß einer einen Rat 

Mfg. VbSpeed


----------



## vbspeed (21. Dezember 2004)

Könnte es sein dass es am code liegt 

Der code um nur 1 Pixel auszulesen und in die
Textbox zu schreiben ist ca. 50 zeilen lang (Nur die zeilen mit Wörtern)

Hm wie aknn ich das verkürzen 

Ich hab jetzt mal ein Bild das 128Pixel breit und 240 Pixel hoch war
konvertiert und das brauchte sicher so um die 2 minuten.
Das is mir zu lange wie kann ich das auf ein paar sekunden oder
besser noch kürzer beschleunigen 

Bei 2 anderen programmen die das fast genauso machen wie meins geht's
auch viel viel schneller (0,5 - 1 Sekunde).

Also nochmal ! Wie kann man das so schnell beschleunigen  !

Mfg. VbSpeed


----------



## vbspeed (22. Dezember 2004)

Hallo Leute,
Ich weiss jetzt wie ich das schneller hinbekomme aber das will nicht
funktionieren und zwar mache ich das soZuerst erläuterung das Problem ist weiter unten)

Ich habe zur probe eine Textbox gemacht(txtBit). Nach jedem Pixel
wird die um eins hochgezählt.

```
txtBit.Text = txtBit.Text + 1
```
 
Soweit sogut.
Dann habe ich eine If anweisung die reagiert wenn in der Textbox
7 drinnsteht (Bit 0-7 = 8Bit):


```
If txtBit.Text = "7" Then
Text2.Text = BinToDez(Text1.Text) 'Den binärstring in Dezimal umwandeln 
Text1.Text = "" 'Die probetextbox in der die binärzahlen zum umwandelsn stehen leeren
Text2.Text = Text2.Text & ", " 'Die Dezimalzahl hinzufügen zu den anderen des bildes
txtBit.Text = "0" 'Den Bitzähler wieder auf zurückstellen.
End If
```
 
Und danach kommt noch eine If routine um nachzusehen ob
das Bild fertig ist, also ob das programm jetzt aufhören kann
zu arbeiten.

*Jetzt zu meinem Problem:*
Es wandelt mir immer nur die ersten 8 Bit(Pixel) des bildes in Dezimal
um und dann springt das programm automatisch zum schluss, also es wird
die oben besagte routine gaktiviert die schaut ob das bild jetzt
zuende ist.

Wie aknn ich es jetzt bewerkstelligen das es genau dieß nicht macht und
weiter bis zu der letzten zahl alles konvertiert 

*Hier der code meiner Binär zu Dezimal umwandlungsroutine:*
*------------------------------------------------------------------------------------------------------------------------*

```
Function BinToDez(ByVal Bin As String) As Integer
Dim x&, y&
	Bin = Bin & String$(8 - Len(Bin), "0")
	For x = 1 To Len(Bin)
	 If Mid$(Bin, x, 1) = "1" Then
		y = y + 2 ^ (8 - x)
	 End If
	Next x
	BinToDez = y
End Function
```
*------------------------------------------------------------------------------------------------------------------------*

Mfg. VbSpeed


----------



## Shakie (22. Dezember 2004)

> Ich hab das ganze in einen Timer getan


Was bitte machst du da mit einem Timer?! Den brauchst du doch gar nicht!


----------



## vbspeed (22. Dezember 2004)

@ Shakie:
Ja nee den hab ich ja jetzt natürlich
damit es schneller geht rausgetan.
Jetzt läuft das so schnell es kann.

Aber hast du ne Idee wegen dem Binär zu Dezimal
übersprung den ich einen beitrag vorger beschriebn hab 

Danke !

Mfg. VbSpeed


----------



## vbspeed (23. Dezember 2004)

Weiß keiner ne Lösung 

Mfg. VbSpeed


----------



## vbspeed (28. Dezember 2004)

Hat einrer schon ne Antwort auf meine Frgae warum
es bie der Dezimalumwnadlung gleich ans ende des bildes springt
und dann aufhört obwohl es nur die ersten 8 bit(pixel) eingelesen hat 

Mfg. VbSpeed


----------



## vbspeed (18. Januar 2005)

Hallo,

Hat entzwischen schon jemand ne Idee 

mfg. VbSpeed


----------



## vbspeed (31. Januar 2005)

Kann man das Bild auch irgendwie anders
in einen string umwandeln
und dann in immer 8 bit aufteilen und zum schluss
noch in hex umwandeln ?


----------

