Forum: PC-Programmierung fopen/fseek/fgetc verkehrtherum


von Simon K. (simon) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi Leutz.

Ich wende folgenden Code an, um aus einer Bitmap Datei die RAW daten zu
lesen.
1
#include "stdio.h"
2
#include "stdlib.h"
3
4
int main()
5
{
6
7
  FILE* filehandle1;
8
  int i;
9
  char temp[100];
10
11
12
  filehandle1 = fopen("C:\\ani\\2.bmp","r");
13
14
  fseek(filehandle1,-0x40, SEEK_END);
15
16
  
17
    for(i=0;i<64;i +=4)
18
    {
19
      itoa((unsigned char)~getc(filehandle1),temp,2);
20
      printf("%08.8s",temp);
21
      itoa((unsigned char)~getc(filehandle1),temp,2);
22
      printf("%08.8s",temp);
23
      itoa((unsigned char)~getc(filehandle1),temp,2);
24
      printf("%08.8s",temp);
25
      itoa((unsigned char)~getc(filehandle1),temp,2);
26
      printf("%08.8s\n",temp);
27
    }
28
29
30
  fclose(filehandle1);
31
32
  return 0;
33
}

(4 Bytes pro Zeile)

Das Problem ist, dass das Bild Vertikal seitenverkehrt ist.
ich habe mal ein bild angehangen, welches ich durch das programm gejagt
habe. (Habe es nach GIF umgewandelt, da BMP nicht erlaubt ist hier). im
nächsten beitrag gibts dann das ergebnis.

von Simon K. (simon) Benutzerseite


Angehängte Dateien:

Lesenswert?

Da ist es

Und? Das bild ist Vertikal spiegelverkehrt. Sprich die Linie, die
eigentlich nach ganz oben gehört, liegt unten.


Ich werde das Gefühl nicht los, dass mich da wieder was Endianmäßiges
plagt.

von Roland P. (pram)


Lesenswert?

nein, Windows speichert das Bild wirklich seitenverkehrt (bzw. unterste
Zeile zuerst) ab.

mach vor jeder Zeile noch ein fseek(filehandle1, -0x04 - i, SEEK_END),
dann sollt er die Datei "rückwärts" einlesen.
Gruß
Roland

von Simon K. (simon) Benutzerseite


Lesenswert?

Jo!
1
#include "stdio.h"
2
#include "stdlib.h"
3
4
int main()
5
{
6
7
  FILE* filehandle1;
8
  int i;
9
  char temp[100];
10
11
12
  filehandle1 = fopen("C:\\ani\\2.bmp","r");
13
14
  fseek(filehandle1,-0x40, SEEK_END);
15
16
  
17
    for(i=0;i<64;i +=4)
18
    {
19
      fseek(filehandle1, -4-i, SEEK_END);
20
      itoa((unsigned char)~getc(filehandle1),temp,2);
21
      printf("%08.8s",temp);
22
      itoa((unsigned char)~getc(filehandle1),temp,2);
23
      printf("%08.8s",temp);
24
      itoa((unsigned char)~getc(filehandle1),temp,2);
25
      printf("%08.8s",temp);
26
      itoa((unsigned char)~getc(filehandle1),temp,2);
27
      printf("%08.8s\n",temp);
28
    }
29
30
31
  fclose(filehandle1);
32
33
  return 0;
34
}

funktioniert!

von Simon K. (simon) Benutzerseite


Lesenswert?

Dankesehr

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.