C/C++ Bilddatei laden

#2983204
Lesenswert?

Hallo,

ich möchte nach langer Zeit mal wieder ein klein wenig Programmieren.

Benutzt wird die Entwicklungsumgebung Visual Studio 2010.
Vorlage: Visual C++  Win32  Win32-Konsolenanwendung.

Auf dem Desktop befindet sich eine Datei Karte.bmp (2.382.666 Bytes).

Vorhaben: Diese Auslesen und im Ram abspeichern.

Programm:
1
char Verzeichnis[] = "C:\\Users\\X.XXXX\\Desktop\\Karte.bmp";//Verzeichniss der .bmp Datei (Bild)
2
fstream* datei;    //Klasse für Datenzugriff anlegen
3
datei = new fstream();
4
char* Datei = NULL;    //Pointer auf Datei
5
long pos_Ende;    //Länge der Datei
6

7
datei->open(Verzeichnis, ios::in);
8
if(datei)// Prüfen, ob Datei vorhanden bzw. fehlerfrei zu öffnen
9
{
10
  cout << "Datei gefunden" << "\n";
11
  datei->seekp( 0, ios::end );//Sprung ans Ende
12
  pos_Ende=datei->tellg();  //Anzahl Bytes ermitteln
13
    
14
  Datei = new char[pos_Ende];//Speicher allozieren
15
  datei->seekp(0, ios::beg );//Sprung auf Beginn
16
  datei->read(Datei, pos_Ende);//Datei in RAM Speichern
17
}
18
else
19
{
20
  cout << "Keine Daten vorhanden oder fehlerhafter Zugriff" << "\n";
21
}
22
datei->close();

Die Anzahl der Bytes wird richtig ermittelt.
Jedoch werden ab einer bestimmen Anzahl geladener Bytes nur noch char 
205 gelesen. Mittels Debugger lässt sich auslesen, was in dem 
allozierten RAM steht.

Im Anhang ist die Datei sowie die Datei, die in den RAM geladen wird. 
Das Original ist 2MB groß deswegen hier etwas komprimiert als JPG.

Jemand eine Idee, warum ich Mist auslese?
Angehängte Dateien:
#2983227
Lesenswert?

>Mach mal binary statt textmode.

Danke klappt nun Einwandfrei, klappt nun einwandfrei.

Copy & Past Fehler übersieht man ständig!

Habe ursprünglich oben nur auf Vorhandensein geprüft, dann geschlossen 
und mit den richtigen Einstellungen neu geöffnet.


Aber schon merkwürdig, das die erste 148682Bytes richtig geladen werden.

PS. selten ein Problem so schnell gelöst.
Gast #2983350
Lesenswert?

Denke bitte daran, dass eine Bitmap nicht nur Bilddaten, sondern, je 
nach Typ noch anderes enthalten kann.
Das Minimum ist ein Vorspann, das Maximum eine Farbtabelle. Willst Du 
dein Programm auch auf andere Formate ausdehnen, kommst Du wohl nicht um 
eine fertige Bibliothek herum. Es sei denn, Du stehst auf 
"selbsterfundene" Räder.
#2983377
Lesenswert?

>das prüft, ob das new geklappt hat, aber nicht, ob die Datei geöffnet
>wurde.

Danke für den Hinweis.

>gibt es überhaupt einen grund, warum du den fstream per new anlegst?

Hatte vorrübergehend einen Pointer an eine Unterfunktion weitergegeben.

>Denke bitte daran, dass eine Bitmap nicht nur Bilddaten, sondern, je
>nach Typ noch anderes enthalten kann.
>Das Minimum ist ein Vorspann, das Maximum eine Farbtabelle. Willst Du
>dein Programm auch auf andere Formate ausdehnen, kommst Du wohl nicht um
>eine fertige Bibliothek herum. Es sei denn, Du stehst auf
>"selbsterfundene" Räder.

Man kann Bilder immer in BMP Format formatieren. Dann ist es nicht 
notwendig, dass mein Programm auch andere Formate unterstützt. Wenn 
jemand jedoch eine schöne Bibliothek kennt kann man die hier natürlich 
posten. dann haben auch andere Interessenten einen Nutzen, wenn Sie 
diesen Post lesen.

Aber mein Hauptinteresse lieg bei dieser einmaligen Anwendung.
Im Anhang sieht man schoneinmal das erste Ergebnis.
Nur Grönland ist noch etwas weiß.
Angehängte Dateien:
#2983469
Lesenswert?

A. R. schrieb:
> Man kann Bilder immer in BMP Format formatieren.

Kann man schon, nur verwendet man das Bitmap-Format doch eher selten. 
Anstatt jedesmal von JPEG, GIF, PNG nach BMP konvertieren zu müssen, 
kann man mit wenig Aufwand ein Programm schreiben, das mit allen 
üblichen Bildformaten zurechtkommt. Dafür gibt es Bibliotheken, die 
einem genau diese Arbeit abnehmen.

In Java zum Beispiel geht es so:
http://www.roseindia.net/java/java-get-example/get-color-of-pixel.shtml

Im Beispiel ist das zwar ein JPEG, könnte aber auch was anderes sein.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren