Seite 1 von 1

Bilddatei in Array speichern????

Verfasst: 02.08.2007 20:26
von JayCool
Hallihallo,

ich würde gerne mit PureBasic etwas in Richtung OCR machen und hab' mir da schon in der Theorie einige Dinge überlegt, wie man das von der mathematischen Seite her lösen könnte.

Mein größtes Problem ist aber Folgendes: Wie kann ich mit relativ einfachen Mitteln ein gescanntes Bild von einem Schriftstück in ein Array übernehmen??? Die Dateien liegen entweder als JPG, BMP, GIF oder PNG vor. Ich glaube PB kann von Haus aus kein GIF importieren, aber das würde nix ausmachen, da ich es mit 'nem Bildbearbeitungsprogramm in andere Formate umwandeln kann.

Ich möchte das Bild nicht anzeigen, sondern die einzelnen Pixel im Bild abtasten und dann weiterverarbeiten.

Ach ja: Das von mir angedachte Programm braucht keine Scannerschnittstelle haben! Die Texte scanne ich separat ein.

Gruß, Jan

PS:
1.) Ich beginne gerade erst, mit PB - also nicht zu viele Vorkenntnisse voraussetzen. Hab' aber früher mal AmigaBasic programmiert und bin mit den allgemeinen Grundlagen vertraut.
2.) Falls das eine Rolle spielt: Ich habe Windows2000 SP4 und die neueste PB-Version 4.10 Beta 2.

Verfasst: 02.08.2007 20:36
von pede
Du kannst ein 2 Dimensionales Array machen

Code: Alles auswählen

Dim MeinArray(x, y)

in x speicherst du die x- Koordinate , in y die y Koordinate...
(die Breite und Höhe des Bildes kannst du mit ImageWidth und ImageHeight harausfinden)

Mit

Code: Alles auswählen

Point(x,y) 
kannst du dann die RGB Farbe speichern...

Verfasst: 02.08.2007 20:37
von Olaf
Einfach alle Bildpunkte in ein 2-dimensionales Array speichern:

Code: Alles auswählen

UsePNGImageDecoder()
Image$="xyz.png"
LoadImage(0,Image$)
w=ImageWidth(0)
h=ImageHeight(0)
Dim Punkte.l(w,h)
StartDrawing(ImageOutput(0))
  For y=0 to h
    For x=0 to w
      Punkte(x,y)=Point(x,y)
    Next x
  Next y
StopDrawing()

Verfasst: 02.08.2007 22:59
von Kaeru Gaman
@JayCool
willkommen im Board

man kann auch direkt auf den Image-speicher zugreifen, z.b. mit BitBlt,
oder mit pointern, der eigentliche speicher der matrix ist im objektheader hinterlegt.

ein vorheriges auslesen in ein array (und dann auch noch per DirectDraw) ist eher kontraduktiv.

...kommt natürlich auch drauf an, was du eigentlich machen willst.

Verfasst: 02.08.2007 23:58
von Zaphod
Die variante über die 2d Drawingbefehle hat allerdings den vorteil, dass sie Betriebssystemunabhängig ist, würde ich deswegen BitBlt vorziehen. Auch ist es nicht so trivial ein jpg auszulesen, darum ist die vorhergehende Überführung in ein Array wahrscheinlich schon sinnvoll.

Verfasst: 03.08.2007 00:16
von Kaeru Gaman
> Auch ist es nicht so trivial ein jpg auszulesen

steht denn ein JPG codiert im speicher?

ich war der ausfassung, dass es beim einladen decodiert wird,
und dann als raw-matrix im speicher steht.
das wäre dann doch wie ein array, auf das man mit pointern zugreifen kann,
wenn man die startadresse der matrix herausfindet.

Verfasst: 03.08.2007 06:12
von JayCool
Hi @ all!

Erstmal vielen Dank an alle!

Ich hab' da mal noch eine Frage:

Wie ist das Bild bei der Lösung von Olaf dann hinsichtlich der Farben abgelegt? Geh ich recht in der Annahme, dass in Punkte.l(x,y) die Bits 0 bis 7 den Rot-Anteil, Bits 8 bis 15 den Grün-Anteil und Bits 16 bis 23 den Blau-Anteil des Bildpunktes enthalten?
Und was bedeuten dann die Bits 24 bis 31???
Olaf hat geschrieben:Einfach alle Bildpunkte in ein 2-dimensionales Array speichern:

Code: Alles auswählen

UsePNGImageDecoder()
Image$="xyz.png"
LoadImage(0,Image$)
w=ImageWidth(0)
h=ImageHeight(0)
Dim Punkte.l(w,h)
StartDrawing(ImageOutput(0))
  For y=0 to h
    For x=0 to w
      Punkte(x,y)=Point(x,y)
    Next x
  Next y
StopDrawing()

Verfasst: 03.08.2007 07:54
von Kaeru Gaman
die beinhalten den Alpha-Kanal, also eine dynamische transparenz.
das wird allerdings nur eingeschränkt benutzt.
(von spielen im 32bit mode; bei XP teilweise bei icons, bei win2k garnicht)

könnte aber auch sein, dass die Farbtiefe deines geladenen Images von der Farbtiefe des Desktops abhängt.
bei 16bit farben hast du normalerweise ne 5/6/5 verteilung.