Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Bitmap bearbeiten

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.04.2003, 08:31 Uhr
~Heike
Gast


Hallo Leute!

Weiß jemand, wie man Bitmaps (oder jpgs) mit der MFC oder anderen Bibliotheken bearbeiten kann.

Hätte jemand einen kleinen Beispielcode für mich, wo ein Bitmap geladen, abgeändert und dann als abgeändertes Bitmap (jpg) wieder abgelegt wird?

Wäre nett

Tschüs Heike
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.04.2003, 19:03 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ich habe mir sowas mal für schwarzweiss bilder geschrieben.
würde dir das helfen? (allerdings wird das dann auch wieder als bitmap abgelegt und nicht als jpeg)
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 28.04.2003 um 19:04 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.04.2003, 20:12 Uhr
~Heike
Gast


Ja, wäre toll
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.04.2003, 20:26 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hiermit kannst du aus einem sw-bitmap die raw-daten auslesen und wieder speichern . Ist allerdings sehr gehackter und unübersichtlicher Code (halt mit mein erstes Programm) Ich kann auch nicht für Fehlerfreiheit garantieren.
Ich weiss auch nicht ob das mit allen sw-bitmaps geht, mit denen die ich aus nem Framegraber gezogen habe ging das jedenfalls.

Nachdem du die rawdaten hast kannst du die einzelchen chars direkt ansprechen und ihnen verschiedene Werte (von 0 schwarz bis 255 weiss) geben.
Da das ein eindimensionales Array ist musst du die Daten mit mit i+j*zeilenlänge ansprechen

Weil der Text zu lang ist in mehreren posts



C++:
typedef struct    {unsigned char byte0,byte1,byte2,byte3;} FOUR_BYTE;

typedef struct  {unsigned char byte0,byte1;} TWO_BYTE;

typedef struct    {    TWO_BYTE    magic_nr;
                    FOUR_BYTE    file_length;
                    FOUR_BYTE    reserved_area;
                    FOUR_BYTE    data_pointer;
                }    BMP_FILE_HEADER;

typedef struct    {    FOUR_BYTE    format_header_length;
                    FOUR_BYTE    picture_width;
                    FOUR_BYTE    picture_height;
                    TWO_BYTE    planes_count;
                    TWO_BYTE    bits_per_pixel;
                    FOUR_BYTE    compression;
                    FOUR_BYTE    imagesize;
                    FOUR_BYTE    x_pixel_per_meter;
                    FOUR_BYTE    y_pixel_per_meter;
                    FOUR_BYTE    amount_used_colors;
                    FOUR_BYTE    amount_important_colors;
                }    BMP_FORMAT_HEADER;

typedef struct    {    BMP_FILE_HEADER        file_header;
                    BMP_FORMAT_HEADER    format_header;
                }    BMP_HEADER;


//liest einen bmp-header aus einem bmp-file und liefert ihn zurück.
BMP_HEADER read_bmpHeader(char* filename){
FILE *fp;
BMP_HEADER header;

fp=fopen(filename,"rb");

header.file_header.magic_nr.byte0 = fgetc(fp);
header.file_header.magic_nr.byte1 = fgetc(fp);

header.file_header.file_length.byte0 = fgetc(fp);
header.file_header.file_length.byte1 = fgetc(fp);
header.file_header.file_length.byte2 = fgetc(fp);
header.file_header.file_length.byte3 = fgetc(fp);

header.file_header.reserved_area.byte0= fgetc(fp);
header.file_header.reserved_area.byte1= fgetc(fp);
header.file_header.reserved_area.byte2= fgetc(fp);
header.file_header.reserved_area.byte3= fgetc(fp);

header.file_header.data_pointer.byte0 = fgetc(fp);
header.file_header.data_pointer.byte1 = fgetc(fp);
header.file_header.data_pointer.byte2 = fgetc(fp);
header.file_header.data_pointer.byte3 = fgetc(fp);


header.format_header.format_header_length.byte0 = fgetc(fp);
header.format_header.format_header_length.byte1 = fgetc(fp);
header.format_header.format_header_length.byte2 = fgetc(fp);
header.format_header.format_header_length.byte3 = fgetc(fp);

header.format_header.picture_width.byte0 = fgetc(fp);
header.format_header.picture_width.byte1 = fgetc(fp);
header.format_header.picture_width.byte2 = fgetc(fp);
header.format_header.picture_width.byte3 = fgetc(fp);

header.format_header.picture_height.byte0 = fgetc(fp);
header.format_header.picture_height.byte1 = fgetc(fp);
header.format_header.picture_height.byte2 = fgetc(fp);
header.format_header.picture_height.byte3 = fgetc(fp);

header.format_header.planes_count.byte0 = fgetc(fp);
header.format_header.planes_count.byte1 = fgetc(fp);

header.format_header.bits_per_pixel.byte0 = fgetc(fp);
header.format_header.bits_per_pixel.byte1 = fgetc(fp);

header.format_header.compression.byte0 = fgetc(fp);
header.format_header.compression.byte1 = fgetc(fp);
header.format_header.compression.byte2 = fgetc(fp);
header.format_header.compression.byte3 = fgetc(fp);

header.format_header.imagesize.byte0 = fgetc(fp);
header.format_header.imagesize.byte1 = fgetc(fp);
header.format_header.imagesize.byte2 = fgetc(fp);
header.format_header.imagesize.byte3 = fgetc(fp);

header.format_header.x_pixel_per_meter.byte0 = fgetc(fp);
header.format_header.x_pixel_per_meter.byte1 = fgetc(fp);
header.format_header.x_pixel_per_meter.byte2 = fgetc(fp);
header.format_header.x_pixel_per_meter.byte3 = fgetc(fp);

header.format_header.y_pixel_per_meter.byte0 = fgetc(fp);
header.format_header.y_pixel_per_meter.byte1 = fgetc(fp);
header.format_header.y_pixel_per_meter.byte2 = fgetc(fp);
header.format_header.y_pixel_per_meter.byte3 = fgetc(fp);

header.format_header.amount_used_colors.byte0 = fgetc(fp);
header.format_header.amount_used_colors.byte1 = fgetc(fp);
header.format_header.amount_used_colors.byte2 = fgetc(fp);
header.format_header.amount_used_colors.byte3 = fgetc(fp);

header.format_header.amount_important_colors.byte0 = fgetc(fp);
header.format_header.amount_important_colors.byte1 = fgetc(fp);
header.format_header.amount_important_colors.byte2 = fgetc(fp);
header.format_header.amount_important_colors.byte3 = fgetc(fp);

fclose(fp);

return header;
}

//schreibt einen bmp-Header in die Datei filename
void write_bmpHeader(char* filename, BMP_HEADER header){
FILE *fp;

fp=fopen(filename,"wb");

fputc(header.file_header.magic_nr.byte0,fp);
fputc(header.file_header.magic_nr.byte1,fp);

fputc(header.file_header.file_length.byte0,fp);
fputc(header.file_header.file_length.byte1,fp);
fputc(header.file_header.file_length.byte2,fp);
fputc(header.file_header.file_length.byte3,fp);

fputc(header.file_header.reserved_area.byte0,fp);
fputc(header.file_header.reserved_area.byte1,fp);
fputc(header.file_header.reserved_area.byte2,fp);
fputc(header.file_header.reserved_area.byte3,fp);

fputc(header.file_header.data_pointer.byte0,fp);
fputc(header.file_header.data_pointer.byte1,fp);
fputc(header.file_header.data_pointer.byte2,fp);
fputc(header.file_header.data_pointer.byte3,fp);


fputc(header.format_header.format_header_length.byte0,fp);
fputc(header.format_header.format_header_length.byte1,fp);
fputc(header.format_header.format_header_length.byte2,fp);
fputc(header.format_header.format_header_length.byte3,fp);

fputc(header.format_header.picture_width.byte0,fp);
fputc(header.format_header.picture_width.byte1,fp);
fputc(header.format_header.picture_width.byte2,fp);
fputc(header.format_header.picture_width.byte3,fp);

fputc(header.format_header.picture_height.byte0,fp);
fputc(header.format_header.picture_height.byte1,fp);
fputc(header.format_header.picture_height.byte2,fp);
fputc(header.format_header.picture_height.byte3,fp);

fputc(header.format_header.planes_count.byte0,fp);
fputc(header.format_header.planes_count.byte1,fp);

fputc(header.format_header.bits_per_pixel.byte0,fp);
fputc(header.format_header.bits_per_pixel.byte1,fp);

fputc(header.format_header.compression.byte0,fp);
fputc(header.format_header.compression.byte1,fp);
fputc(header.format_header.compression.byte2,fp);
fputc(header.format_header.compression.byte3,fp);

fputc(header.format_header.imagesize.byte0,fp);
fputc(header.format_header.imagesize.byte1,fp);
fputc(header.format_header.imagesize.byte2,fp);
fputc(header.format_header.imagesize.byte3,fp);

fputc(header.format_header.x_pixel_per_meter.byte0,fp);
fputc(header.format_header.x_pixel_per_meter.byte1,fp);
fputc(header.format_header.x_pixel_per_meter.byte2,fp);
fputc(header.format_header.x_pixel_per_meter.byte3,fp);

fputc(header.format_header.y_pixel_per_meter.byte0,fp);
fputc(header.format_header.y_pixel_per_meter.byte1,fp);
fputc(header.format_header.y_pixel_per_meter.byte2,fp);
fputc(header.format_header.y_pixel_per_meter.byte3,fp);

fputc(header.format_header.amount_used_colors.byte0,fp);
fputc(header.format_header.amount_used_colors.byte1,fp);
fputc(header.format_header.amount_used_colors.byte2,fp);
fputc(header.format_header.amount_used_colors.byte3,fp);

fputc(header.format_header.amount_important_colors.byte0,fp);
fputc(header.format_header.amount_important_colors.byte1,fp);
fputc(header.format_header.amount_important_colors.byte2,fp);
fputc(header.format_header.amount_important_colors.byte3,fp);

fclose(fp);

}



--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 28.04.2003 um 20:32 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.04.2003, 20:26 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



C++:
unsigned char* bmp2raw(char* bmp_filename){
FILE *fp;
BMP_HEADER header;
unsigned char *raw_data;
int xdim,ydim,i,j;

header=read_bmpHeader(bmp_filename);

xdim=    header.format_header.picture_width.byte0
    +    header.format_header.picture_width.byte1 * 256
    +    header.format_header.picture_width.byte2 * 256*256
    +    header.format_header.picture_width.byte3 * 256*256*256;
    
ydim=    header.format_header.picture_height.byte0
    +    header.format_header.picture_height.byte1 * 256
    +    header.format_header.picture_height.byte2 * 256*256
    +    header.format_header.picture_height.byte3 * 256*256*256;

//Pointer auf Datenanfang ermitteln
j    =    header.file_header.data_pointer.byte0
    +    header.file_header.data_pointer.byte1 *256
    +    header.file_header.data_pointer.byte2 *256*256
    +    header.file_header.data_pointer.byte3 *256*256*256;

//Speicher für die einzulesenden Daten allokieren
raw_data= new unsigned char[xdim*ydim];

fp=fopen(bmp_filename,"rb");

//bis zum Datenanfang gehen (Header weglesen)
for(i=0;i<j;i++){fgetc(fp);}

//Bilder gespiegelt ins array einlesen (da bmp links unten anfaengt)
for(j=ydim-1;j>=0;j--){
    for(i=0;i<xdim;i++){
        raw_data[i+j*xdim]=fgetc(fp);
    }
}

fclose(fp);

return raw_data;
}

void raw2bmp(unsigned char* raw_data,char* bmp_filename, int xdim, int ydim){
FILE *fp;
int i,j;

fp=fopen(bmp_filename,"wb");

i=xdim*ydim + 4*256 + 54;        //Dateilaenge ermitteln

//Datei-Header schreiben

    fputc(66,fp);fputc(77,fp);    //Magic Number
    
    j=i%256;                        fputc(j,fp);    //Dateilaenge                        
    j=(i%(256*256))/256;            fputc(j,fp);
    j=(i%(256*256*256))/(256*256);    fputc(j,fp);
    j=i/(256*256*256);                fputc(j,fp);

    fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);//4 reservierte Byts
    
    fputc(54,fp);fputc(4,fp);fputc(0,fp);fputc(0,fp);//Zeiger auf Datenanfang

//Format-Header schreiben
    
    fputc(40,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);//Format-Header-Laenge
    
    j=xdim%256;                            fputc(j,fp);    //Bildbreite                        
    j=(xdim%(256*256))/256;                fputc(j,fp);
    j=(xdim%(256*256*256))/(256*256);    fputc(j,fp);
    j=xdim/(256*256*256);                fputc(j,fp);

    j=ydim%256;                            fputc(j,fp);    //Bildhoehe                        
    j=(ydim%(256*256))/256;                fputc(j,fp);
    j=(ydim%(256*256*256))/(256*256);    fputc(j,fp);
    j=ydim/(256*256*256);                fputc(j,fp);
    
    fputc(1,fp);fputc(0,fp);                //Anzahl der Ebenen

    fputc(8,fp);fputc(0,fp);                //Bits pro Pixel

    fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //Kompression
                
    i=xdim*ydim;
    j=i%256;                        fputc(j,fp);    //Groesse der Pixeldaten                        
    j=(i%(256*256))/256;            fputc(j,fp);
    j=(i%(256*256*256))/(256*256);    fputc(j,fp);
    j=i/(256*256*256);                fputc(j,fp);

    fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //x-Auflösung(in Pixel pro Meter)    
    
    fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //y-Auflösung(in Pixel pro Meter)

    fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //Anzahl genutzter Farben
    
    fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //Anzahl wichtiger Farben

    //1kB einfuegen jedes mögliche Byte wird dreimal wiederholt und dann ein Nullbyte angefuegt
    for(i=0;i<256;i++){fputc(i,fp);fputc(i,fp);fputc(i,fp);fputc(0,fp);}
    
    //Bild an der y-Achse spiegeln: Bild faengt bei bmp links unten an.
    for(j=ydim-1;j>=0;j--){
        for(i=0;i<xdim;i++){
            fputc(raw_data[i+j*xdim],fp);
        }
    }
    
    fclose(fp);
}



int get_xdim_bmp(char* bmp_filename){
BMP_HEADER header;
int xdim;

header=read_bmpHeader(bmp_filename);

xdim=    header.format_header.picture_width.byte0
    +    header.format_header.picture_width.byte1 * 256
    +    header.format_header.picture_width.byte2 * 256*256
    +    header.format_header.picture_width.byte3 * 256*256*256;
    

return xdim;
}


int get_ydim_bmp(char* bmp_filename){
BMP_HEADER header;
int ydim;

header=read_bmpHeader(bmp_filename);

ydim=    header.format_header.picture_height.byte0
    +    header.format_header.picture_height.byte1 * 256
    +    header.format_header.picture_height.byte2 * 256*256
    +    header.format_header.picture_height.byte3 * 256*256*256;

return ydim;
}


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 28.04.2003 um 20:28 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: