Gå til innhold

Lese Bitmap fil, hvordan lese?


Anbefalte innlegg

Skrevet

Hei!

 

Jeg har lest om Bitmap, og vet sånn ca. hvordan den er bygget opp.

Men hvordan kan jeg hoppe rundt i filen å laste de riktige verdiene inn i de riktige varibalene?

 

Jeg lukter en struktur, og bruk av sizeof og & operatøren.

 

Noen forslag?

Videoannonse
Annonse
Skrevet (endret)

Hehe du skal nå ha takk iallefall. :D

C++ kode er noe sjit, jeg er bare avhengig. :p

Jeg har skrevet hello-world og har grunnleggende syntaks forståelse i de fleste språk, C++ er bare kjekt å kunne når man driver med reversing.

(Strukturen på klassen etc)

 

Edit:

Jeg bruker linux, og vil helst at koden er fullstendig.

(Ikke bygger på ferdige libs and stuff, kun bruk av STD)

Endret av Frysning
Skrevet (endret)

int size; // Størrelsen av hele fila
char *arr; // Minneområdet for å holde på hele bitmap fila

FILE *fp = fopen("minfil.bmp", "br"); // Åpne filen for binary access read

fseek(fp, 0, SEEK_END); // Gå til slutten av fila
size = ftell(fp); // Finn ut hvor slutten av fila er (dette er størrelsen)
fseek(fp, 0, SEEK_SET); // Flytt tilbake til start

arr = new char[size]; // Alloker minne

fread(arr, 1, size, fp); // Les hele fila inn i minnet

fclose(fp); // Lukk fila

// Finn bitmapfileheader
BITMAPFILEHEADER *hdr = (BITMAPFILEHEADER*)arr;
// Finn bitmapinfoheader, som kommer rett etter bitmapfileheader
BITMAPINFOHEADER *info = (BITMAPINFOHEADER)(arr + sizeof(BITMAPHEADER));
// Finn bildedata
char *img_ptr = arr + hdr->bfOffBits;

 

Nå inneholder hdr fil headeren, info inneholder informasjon om bildet, og img_ptr er pekeren til bildedata.

Endret av GeirGrusom
Skrevet

Takk takk. :D

 

Kombinert holder jeg på å lese om streams og file processing i boken også.

Der brukes ifstream og ofstream så jeg antar at dette er C-style.

As long as it works, who cares. xD

Skrevet

Jepps, det stemmer. fread, fopen, freopen, osv. er C-style, og ifstream og ofstream er som du sier C++-style. fstream biblioteket er vel å foretrekke over C-alternativet, så jeg anbefaler deg å bruke dette så langt du kan. :)

Skrevet (endret)

Jeg misliker STL, så jeg pleier som regel å foretrekke C bibliotekene :-P

edit: eller bare gi blanke i C++ og bruke et mer egnet verktøy...

Endret av GeirGrusom
Skrevet (endret)

Hvis Windows er platformen din kan du like godt gjøre det enkelt å bruke GDI+. Da kan du klare deg med noen få linjer kode. Det finnes massevis av dokumentasjon og eksempler for hvordan du bruker GDI+.

 

Et lite eksempel (hadde ikke kompilator tilgjengelig når jeg skrev dette...):

 

#include <gdiplus.h>
#include <memory>

int main()
{
 ULONG_PTR gdiplusToken;

 // init
 Gdiplus::GdiplusStartupInput gdiplusStartup;
 Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartup, NULL);

 // load bitmap
 std::auto_ptr<Gdiplus::Bitmap> bitmap(Gdiplus::Bitmap::FromFile( L"bitmap.jpg" ) );

 // do something with bitmap ...
 

 // cleanup
 Gdiplus::GdiplusShutdown(m_gdiplusToken);

}

Endret av kjetil7

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...