Bilddatei in Array speichern????

Anfängerfragen zum Programmieren mit PureBasic.
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

Bilddatei in Array speichern????

Beitrag 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.
pede
Beiträge: 90
Registriert: 08.07.2007 20:37
Wohnort: brixen / Italien

Beitrag 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...
Zuletzt geändert von pede am 02.08.2007 20:38, insgesamt 1-mal geändert.
"oh... ein Sarkasmus-Detektor... ein wirklich nützliches Gerät" .. dit.. dit.. ditditdit.. *bumm*
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Beitrag 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()
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

Beitrag 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()
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten