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
charVerzeichnis[]="C:\\Users\\X.XXXX\\Desktop\\Karte.bmp";//Verzeichniss der .bmp Datei (Bild)
2
fstream*datei;//Klasse für Datenzugriff anlegen
3
datei=newfstream();
4
char*Datei=NULL;//Pointer auf Datei
5
longpos_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=newchar[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?
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
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.
>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.
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.
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.
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?
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.
>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ß.
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?
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.