Bilder einlesen

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Bilder einlesen

Beitrag von Jan »

Kann jemand mir einen Einstieg geben, wie ich Bilder in eine Datenbank einlese? Mir fehlt irgendwie der Einsatzpunkt.

Ich habe eine FOXCDX, als Felder Typ "V". Was ja wohl das allerbeste dafür ist.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

Code: Alles auswählen

cBild := memoread("bild.bmp")
...
replace BildFeld with cBild // FOXCDX Typ V
memoread() sollte man eigentlich nicht für Binärdaten verwenden, auch wenn ich damit noch keine Probleme hatte. Bei den Tools gibt es FileStr() oder StrFile() - bin mir nicht sicher - und in der Wissensdatenbank habe ich Funktionen für lowlevel Datei lesen und schreiben hinterlegt.

Keinesfalls MemoWrit() zum Schreiben verwenden, da dieser ein chr(26) anhängt !
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Hubert,

danke für den Tipp.

Aber jetzt noch eine Frage: Wie groß muß ich denn das Feld einstellen? In der Onlinehilfe steht in der Feldbeschreibung, das kann 4 oder 10 lang sein. Im Beispiel einige Zeilen dahinter ist das aber mit 30 eingebaut.

Was ist denn da nun richtig? Und warum?

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

ich habe es zwar noch nicht mit FOXDBE probiert, aber ich meine bei DATUM, LOGISCH und Memofeldern ist der von dir angegebene Wert egal, da Xbase++ automatisch den Richtigen einträgt.

Ich vermute, dass DBFDBE bei Memos immer 10 und bei FOXDBE immer 4 Stellen benötigt und daher auch einsetzt. Die 4 Stellen reichen, da der Offsetwert in der Memodatei als gepackte Zahl gespeichert wird und daher weniger Platz als bei DBFDBE braucht.
Zuletzt geändert von brandelh am Mi, 27. Feb 2008 12:12, insgesamt 1-mal geändert.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Es geht übrigens auch mit DBFNTX-Memofeldern, nur auf Umwegen:

db->MyMemo := Str2Hex(FileStr("c:\bilder\meinbild.jpg"))

(beides Funktionen aus den Tools)

Beim Auslesen muß man dann natürlich Hex2Str() anwenden.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo ihr beiden,

Ich hab das jetzt mal mit 10 versucht, funktioniert einwandfrei. Ich werd das auch mal mit 4 versuchen. Allerdings ist das aus Platzgründen nicht ganz so wild wie bei Jimmy. Ich werde nur max ca. 500 Sätze haben.

Ich arbeite inzwischen grundsätzlich mit FOXCDX. Ich seh da einfach eine ganze menge Vorteile für mich. Ich habe da die Sequenz-Felder, nur eine Indexdatei, die ich mit gleichem Namen benenne wir die dbf (macht es für mich übersichtlich). Die beiden Punkte sind für mich die wichtigsten. Angeblich soll ja auch die Performance besser sein. Was ich mangels riediger Datenmengen nicht wirklich nachvollziehen kann. Und das mit den Bildern im memofeld schien mir auch einfacher zu sein. Bis zu dem Beitrag oben von Tom. Man lernt halt immer dazu 8)

Und jetzt noch eine Frage: Nach dem Hinweis von Hubert hab ich jetzt ein paar Testbilder sauber einlesen können. Aber wie bekomme ich die wieder raus und zeige die auf dem Bildschirm an? Die Bildschirmanzeige mit Recourcen-Bildern klappt ja, da mache ich das über :load(). Aber hier beißte ich irgendwie auf Granit.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Jan hat geschrieben:Hallo ihr beiden,

Ich hab das jetzt mal mit 10 versucht, funktioniert einwandfrei. Ich werd das auch mal mit 4 versuchen. Allerdings ist das aus Platzgründen nicht ganz so wild wie bei Jimmy.
ich denke, dass egal ob du 4 oder 10 angibst, intern immer 4 bei FoxDBE genutzt werden, er braucht einfach nicht mehr.

Das einlesen des Bildes in eine Speichervariable geht ganz einfach:

cBild := db->BildFeld

Bei der Anzeige in einem XbpBitmap Objekt hingegen bin ich mir nicht sicher, ob du das zuerst wieder speichern und erneut laden musst (das ist von der Syntax einfach ...) oder ob es mit load() oder setbuffer() auch direkt geht.

Jimmy hat in dem List&Label Thread doch mal was in die Richtung geschrieben ...
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Hubert,

Danke für den Hinweis, aber inzwischen habe ich die Lösung gefunden. Einlesen des Bildes habe ich gemacht wie Du es angibst. Sehr simpel. Das Anzeigen ist ebenfalls sehr einfach. Das funktioniert wie bei einer recource, aber statt :load() nehme ich :setBuffer(cBild) Und schwupp - ist das Bild da. Also nicht, wie Du schlimmstenfalls vermutet hast, mit zwischenspeichern. Sondern direkt. Das Zwischenspeichern war doch Jimmys Problem mit den Reportgeneratoren gewesen, oder?

Tolle Sache das ganze!

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

schön dass es einfach geht ... und eben fällt mir ein, dass das MDI und SDI Beispiel doch auch sowas macht oder ?

Ja die laden auch aus einer DBF / FPT Kombination, allerdings haben sie wieder eine eigene Klasse gebastelt, die es einfacher machen soll aber für mich umständlicher erscheint. So hat halt jeder seine Vorlieben.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: ... und eben fällt mir ein, dass das MDI und SDI Beispiel doch auch sowas macht oder ?
Das war auch meine Ausgangs Basis.
brandelh hat geschrieben: cBild := memoread("bild.bmp")
Tom hat geschrieben: Str2Hex(FileStr("c:\bilder\meinbild.jpg"))
Bevor ich List & Label verwendet habe hätte ich gesagt "das ist falsch".
(p.s. man kann auch Bitmap in DBFNTX Memo mit :setbuffer() "speichern")

Der Unterschied von den beiden zu den Alaska MDI Beispiel ist das man
im Memofeld dann das "gesamte" Bitmap inclusive des 14 Byte Header
hat. Das "kann" nun "helfen" oder "stören" je nachdem was man dann
mit dem Bitmaps vor hat.

Alaska geht immer den Weg über ein Bitmap Object. Zum "laden" nimmt
man da :loadfile() bei "externen" und :setbuffer() bei "internen" Bitmaps.
Zum "speichern" des Bitmap Object nimmt Alaska :setbuffer() wobei dann
die besagten 14 Byte des Header nicht im Memo abgespeichert werden.
gruss by OHR
Jimmy
Antworten