Forum: PC-Programmierung C/C++ Bilddatei laden


von A. R. (redegle)


Angehängte Dateien:

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?

von Sven B. (scummos)


Lesenswert?

Auf die Gefahr hin wieder völlig vom Thema abzukommen, warum nutzt du 
nicht eine der zahlreichen Bibliotheken, die Bilder verarbeiten können? 
An dieser Stelle muss man das Rad wirklich nicht neu erfinden.

Grüße,
Sven

von A. R. (redegle)


Lesenswert?

Ich möchte nur einmalig an einzelnen ausgewählten Punkten auslesen, ob 
der Pixel mehr blau oder mehr grün ist. Bei einer Rastergrafik geht das 
ganz fix.

Dafür lohnt es sich nicht in eine neue Bibliotheken einzuarbeiten. Aber 
danke für den Hinweis für ein anderes Vorhaben würde das durchaus Sinn 
machen.

von g457 (Gast)


Lesenswert?

> datei->open(Verzeichnis, ios::in);

Mach mal binary statt textmode.

von A. R. (redegle)


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.

von camikusch (Gast)


Lesenswert?

möglicherweise wäre es trotzdem sinnvoll ein framework zum (multiformat) 
bilder einlesen und dann ein "rgb = getpixel(x,y)" zu machen - wenn du 
mehr als ein und das selbe bild oder immer den selben dateityp lesen 
willst.

von D2D (Gast)


Lesenswert?

Microsoft hat z.B. das WIC API für diverse Bildformate. In Kombination 
mit Direct2D kann man damit gut arbeiten.

von Sven B. (scummos)


Lesenswert?

D2D schrieb:
> Microsoft hat z.B. das WIC API für diverse Bildformate. In Kombination
> mit Direct2D kann man damit gut arbeiten.

... wenn man sich mal wieder ohne guten Grund auf eine einzige Plattform 
festlegen will, heißt das.

von Vlad T. (vlad_tepesch)


Lesenswert?

A. R. schrieb:
> if(datei)// Prüfen, ob Datei vorhanden bzw. fehlerfrei zu öffnen

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

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

von amateur (Gast)


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.

von A. R. (redegle)


Angehängte Dateien:

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ß.

von Vlad T. (vlad_tepesch)


Lesenswert?

A. R. schrieb:
>>gibt es überhaupt einen grund, warum du den fstream per new anlegst?
>
> Hatte vorrübergehend einen Pointer an eine Unterfunktion weitergegeben.

und?

von Mark B. (markbrandis)


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.

von g457 (Gast)


Lesenswert?

> eine schöne Bibliothek

OpenCV [0]

[0] http://opencv.org/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.