Bug im Borland Builder?! kann kein Bild speichern

Cecidi

Mitglied
Im MSND finde ich 2 Funktionen mit denen ich ein Bitmapbild speichern kann. Wenn ich das diese Funktionen in ein "Visual Studio C++"- oder gar "Bloodshed Dev-C++"-Projekt einbinde, kann ich wie gewünscht ein Bild erstellen. Nun muss ich aber leider mit dem "C++ Borland Builder 6.0" arbeiten, da ich an einer anderen Stelle dessen VCL benutze. Dieser erstellt mir jedoch, wenn ich ein Bild speichern will, zwar eine Datei, aber diese lässt sich mit keinem gängigen Betrachter öffnen. (Fehlerhaftes Format / Nicht genügend Arbeitspeicher (bei einem 3MB großem Bild :confused:)

Weiß zufällig jemand wie ich den Code abendern muss, damit er auch im Borland Builder funktioniert (Ich möchte aber mit den Win-Api-Funktionen das Bild bearbeiten, nicht mit der VCL, daher kann ich kein TBitmap zum Bearbeiten benutzen)

Hat der Borland Builder an dieser Stelle einen Bug, oder fehlen ihm nur irgendwelche Dateien (wenn ja welche)?

Alternativ wäre es auch möglich das HBitmat in ein TBitmap umzuwandeln, aber auch hier weiß ich nicht wie. :( Oder auch das Umwandeln eines kompletten Borland Builder Projekt in ein "MS VC++"- bzw. "Dev-C++"-Projekt.

Ich bin für jede Idee dankbar.

mfg Cecidi ;)
 
Generell ist der Builder eigentlich viel einfacher handzuhaben als Visual. Jetzt ist
mir nur unklar:
- ob du das Bild im Speicher baust oder von Platte lädst und veränderst ?
- welche Funktionen das sind mit denen du das Bild speichern willst ?

Es gibt um Builder verschiedenste Möglichkeiten mit Bildern rumzuhantieren,
deshalb kann ich dir nur Ratschläge geben, wenn du zu obigen Fragen Stellung
nimmst...

BadMourning
 
Hi,
Ich weiß, dass das Bilderbearbeiten in MS Visual C++ ein bisschen schwieriger ist als wenn man die vordefienierten Funktionen (aus der VCL) vom Borland Builder benutzt. Dennoch müssten die Funktionen die die in der Win-Api beschrieben sind theoretisch genauso im C++ BB funktionieren?!
(Das erstellen (im Arbeitsspeicher) und das Ausgeben auf dem Monitor klappt zum Beispiel ohne Probleme)

Die Funktionen aus dem MSDN auf die ich verwiesen habe sind nur ein Beispiel zur Speicherung von Bildern. Auf "Win-Api.net" findet man z.B. die Funktion zur Screenshoterstellung: dc2Bitmap(). Diese kann man 1 zu 1 in den Compiler kopieren und ausprobieren. Leider funktioniert sie zwar im "MS Visual C++" oder "Bloodshed Dev-C++", aber nicht im Borland C++ Builder.(hab ich ausprobiert)
Da man aber ansonsten Bilder erstellen und auf dem Monitor ausgeben kann, glaube ich, dass die Funtktion die eigentlich nicht richtig funktioniert "WriteFile(...)" ist, die zum Schreiben benutzt wird.

Mir ist auch klar, dass ich im C++ BB ein TBitmap erstellen kann und dann mit SaveToFile(...) speichern kann. Das Problem besteht aber darin, dass ich umfangreiche Berechnungen am Bild vornehme, für die TBitmap einfach viel zu langsam im Zugriff ist. Daher muss ich auf hBitmap aus der Win-Api zurückgreifen. (Diese Bearbeitung klappt übrigens sehr gut, nur das speichern eben nicht?)

Danke für deine Bemühungen,
mfg Cecidi

Anmerkung: Beim Speichern entstehen keinerlei Exeptions!
 
Für dein Problem habe ich so keine Lösung, weil ich nicht mit den Winapi-Funktionen
arbeite. Ich erstelle mir so gut wie alle Funktionen zum Bearbeiten von Bitmaps selbst.

Ich hole mir mit Bitmap->ScanLine[ BitmapHeight - 1 ] einen Zeiger
auf den Bildspeicher und bearbeite den dann mit meinn Funktionen.

Damit hast du selbst in der Hand, wie optimiert dein Code zum Bearbeiten
ist, und trotzdem hast du die Annehmlichkeit, das du dich nicht um irgendwelche
Header oder um das Öffnen und Speichern kümmern mußt.

Vielleicht hast du über diese Möglichkeit noch nicht nachgedacht. Ansonsten
kann ich dir leider nicht weiterhelfen und wünsche dir trotzdem viel Erfolg

BadMourning
 
Danke für deine Bemühungen ;-)

Inzwischen hab ich aber ne andere Variante gefunden (auch wenn sie nicht ganz 'sauber' programmiert ist):

Wie du wahrscheinlich weist, ist die Klasse TBitmap auch nur ein Bitmap-objekt, dass alle möglichen Eigenschaften und Methoden kapselt. Eine Eigenschaft ist 'Handle', ein Zeiger auf das gekappselte HBitmap Bild. Machts klick

Ich kann einfach ein TBitmap anlegen und es auf mein Bild verweisen, dann kann ich die Methode 'SaveToFile' benutzen. So gehts dann ;>

Allerdings ist mir immernoch schleierhaft, warum die Funktionen der WinApi nicht zum Speichern funktionieren ?

mfg Cecidi
 
Hä... die WinApi-Funktion tut mit dem Builder nicht?
Inwiefern?
WinApi-Funktionen sollten egal mit welchem Compiler gleichermassen funktionieren, solang sie aus der Dll ausgeführt werden...
..vielleicht fehlt ein nötiger Initialisierungsaufruf für die Dll, den VsC++ und Bloodshet automatisch schon in den Startcode stellen?
 
Ich glaube, dass ich das Problem recht ausführlich beschrieben habe.

Wenn du es mir nicht glaubst, probier es doch einfach mal aus

..vielleicht fehlt ein nötiger Initialisierungsaufruf für die Dll, den VsC++ und Bloodshet automatisch schon in den Startcode stellen?

Wenn du die nötigen Einstellungen kennst, kannst du sie mir ja sagen, die Standarteinstellungen funktionieren nicht!
 
Ich hab den Builder nicht, daher kann ichs nicht ausprobieren... aber ich glaub dir doch auch so!
Also eigentlich (nach Betrachtung der verwendeten Funktionen und deren ImportDlls) kann ich mir auch nicht vorstellen, dass ein nötiger Initialisierungsaufruf fehlt..
Was noch möglich wäre:
in den Headerfiles des Builders stimmt irgendwas nicht...
...vergleichstu mal alle verwendeten structs, Konstanten und so, mit denen des vsc++ oder vergleichst den generierten asm-Code...
ansonsten wüsst ich nix mehr, was da schiefgehen könnte, wenn der Code fehlerfrei ist...
 
...vergleichstu mal alle verwendeten structs, Konstanten und so, mit denen des vsc++ oder vergleichst den generierten asm-Code...
Die Idee ist ja gut, aber ich finde das is ne bisschen viel Code zum Verglchen?!

Oder ? :-)

Außerdem meine ich gelesen zu haben, dass die Headder im Borland Builder sowieso angepasst sind, sodass eine einfacher Vergleich wegfällt!
 
Zurück