Programmatically making an bmp image
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
I am trying to make my own classes to manipulate BMP images..
I started off with this simple code:
Everything has been done as given in this wikepedia link.
I am having two problems:
When I try to open the image it's giving error
Premature end of file detected
The actual file I created exceeds the file size thats supposed to be by two bytes.
Here's the code:
#include <fstream>
#include <iostream>
using namespace std;
struct BMP_Header
{
public :
char id[2];
unsigned int total_image_size;
short int app_data1,app_data2;
unsigned int offset;
};
struct DIB_Header
{
public :
unsigned int dib_header_size;
int image_width;
int image_height;
short int no_colour_planes;
short int colour_depth;
unsigned int compression_method;
unsigned int raw_image_size;
unsigned int horizontal_resolution;
unsigned int vertical_resolution;
unsigned int num_colours_palette;
unsigned int imp_colours_used;
};
int main ()
{
int index=0;
BMP_Header bmp_header;
DIB_Header dib_header;
char pixel_array[16];
bmp_header.total_image_size=70;
bmp_header.offset=54;
bmp_header.id[0]='B';
bmp_header.id[1]='M';
bmp_header.app_data1=0;
bmp_header.app_data2=0;
dib_header.dib_header_size=40;
dib_header.image_width=2;
dib_header.image_height=2;
dib_header.colour_depth=24;
dib_header.raw_image_size=16;
dib_header.horizontal_resolution=2835;
dib_header.vertical_resolution=2835;
dib_header.no_colour_planes=1;
dib_header.compression_method=0;
dib_header.num_colours_palette=0;
dib_header.imp_colours_used=0;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=255;
pixel_array[index++]=255;
pixel_array[index++]=255;
pixel_array[index++]=255;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=255;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=255;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=0;
// Image Made
fstream file;
file.open ("abc.bmp",ios::out | ios::binary);
file.write ((char*)&bmp_header,sizeof (bmp_header));
file.write ((char*)&dib_header,sizeof (dib_header));
file.write ((char*)pixel_array,sizeof (pixel_array));
file.close ();
return 0;
}
c++ image bmp
|
show 6 more comments
I am trying to make my own classes to manipulate BMP images..
I started off with this simple code:
Everything has been done as given in this wikepedia link.
I am having two problems:
When I try to open the image it's giving error
Premature end of file detected
The actual file I created exceeds the file size thats supposed to be by two bytes.
Here's the code:
#include <fstream>
#include <iostream>
using namespace std;
struct BMP_Header
{
public :
char id[2];
unsigned int total_image_size;
short int app_data1,app_data2;
unsigned int offset;
};
struct DIB_Header
{
public :
unsigned int dib_header_size;
int image_width;
int image_height;
short int no_colour_planes;
short int colour_depth;
unsigned int compression_method;
unsigned int raw_image_size;
unsigned int horizontal_resolution;
unsigned int vertical_resolution;
unsigned int num_colours_palette;
unsigned int imp_colours_used;
};
int main ()
{
int index=0;
BMP_Header bmp_header;
DIB_Header dib_header;
char pixel_array[16];
bmp_header.total_image_size=70;
bmp_header.offset=54;
bmp_header.id[0]='B';
bmp_header.id[1]='M';
bmp_header.app_data1=0;
bmp_header.app_data2=0;
dib_header.dib_header_size=40;
dib_header.image_width=2;
dib_header.image_height=2;
dib_header.colour_depth=24;
dib_header.raw_image_size=16;
dib_header.horizontal_resolution=2835;
dib_header.vertical_resolution=2835;
dib_header.no_colour_planes=1;
dib_header.compression_method=0;
dib_header.num_colours_palette=0;
dib_header.imp_colours_used=0;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=255;
pixel_array[index++]=255;
pixel_array[index++]=255;
pixel_array[index++]=255;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=255;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=255;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=0;
// Image Made
fstream file;
file.open ("abc.bmp",ios::out | ios::binary);
file.write ((char*)&bmp_header,sizeof (bmp_header));
file.write ((char*)&dib_header,sizeof (dib_header));
file.write ((char*)pixel_array,sizeof (pixel_array));
file.close ();
return 0;
}
c++ image bmp
This code only ever puts one entry into thepixel_array
array here. You probably want to use a loop here so that you cover everyindex
in the array. Also I would strongly suggest using the c++ standard library containers, such asstd::vector
orstd::array
, over these raw arrays.
– shuttle87
Jun 26 '14 at 17:16
i have initialized all the elements of the pixel array....pls have a look...
– PRP
Jun 26 '14 at 17:18
1
Consider usingstruct
to make it abundantly clear thatBMP_Header
andDIB_Header
should be POD. Also consider putting the member-initializers directly on the member-declarations, so you can remove the custom constructor... Next, are you absolutely sure you need those casts tochar*
?
– Deduplicator
Jun 26 '14 at 17:21
Ok...will try doing so..btw what is POD....?
– PRP
Jun 26 '14 at 17:22
1
Besides all the rest, you should be using fixed width types, otherwise on another platform/compiler you risk messing up the memory layout due to different sizes types.
– Matteo Italia
Jun 26 '14 at 17:32
|
show 6 more comments
I am trying to make my own classes to manipulate BMP images..
I started off with this simple code:
Everything has been done as given in this wikepedia link.
I am having two problems:
When I try to open the image it's giving error
Premature end of file detected
The actual file I created exceeds the file size thats supposed to be by two bytes.
Here's the code:
#include <fstream>
#include <iostream>
using namespace std;
struct BMP_Header
{
public :
char id[2];
unsigned int total_image_size;
short int app_data1,app_data2;
unsigned int offset;
};
struct DIB_Header
{
public :
unsigned int dib_header_size;
int image_width;
int image_height;
short int no_colour_planes;
short int colour_depth;
unsigned int compression_method;
unsigned int raw_image_size;
unsigned int horizontal_resolution;
unsigned int vertical_resolution;
unsigned int num_colours_palette;
unsigned int imp_colours_used;
};
int main ()
{
int index=0;
BMP_Header bmp_header;
DIB_Header dib_header;
char pixel_array[16];
bmp_header.total_image_size=70;
bmp_header.offset=54;
bmp_header.id[0]='B';
bmp_header.id[1]='M';
bmp_header.app_data1=0;
bmp_header.app_data2=0;
dib_header.dib_header_size=40;
dib_header.image_width=2;
dib_header.image_height=2;
dib_header.colour_depth=24;
dib_header.raw_image_size=16;
dib_header.horizontal_resolution=2835;
dib_header.vertical_resolution=2835;
dib_header.no_colour_planes=1;
dib_header.compression_method=0;
dib_header.num_colours_palette=0;
dib_header.imp_colours_used=0;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=255;
pixel_array[index++]=255;
pixel_array[index++]=255;
pixel_array[index++]=255;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=255;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=255;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=0;
// Image Made
fstream file;
file.open ("abc.bmp",ios::out | ios::binary);
file.write ((char*)&bmp_header,sizeof (bmp_header));
file.write ((char*)&dib_header,sizeof (dib_header));
file.write ((char*)pixel_array,sizeof (pixel_array));
file.close ();
return 0;
}
c++ image bmp
I am trying to make my own classes to manipulate BMP images..
I started off with this simple code:
Everything has been done as given in this wikepedia link.
I am having two problems:
When I try to open the image it's giving error
Premature end of file detected
The actual file I created exceeds the file size thats supposed to be by two bytes.
Here's the code:
#include <fstream>
#include <iostream>
using namespace std;
struct BMP_Header
{
public :
char id[2];
unsigned int total_image_size;
short int app_data1,app_data2;
unsigned int offset;
};
struct DIB_Header
{
public :
unsigned int dib_header_size;
int image_width;
int image_height;
short int no_colour_planes;
short int colour_depth;
unsigned int compression_method;
unsigned int raw_image_size;
unsigned int horizontal_resolution;
unsigned int vertical_resolution;
unsigned int num_colours_palette;
unsigned int imp_colours_used;
};
int main ()
{
int index=0;
BMP_Header bmp_header;
DIB_Header dib_header;
char pixel_array[16];
bmp_header.total_image_size=70;
bmp_header.offset=54;
bmp_header.id[0]='B';
bmp_header.id[1]='M';
bmp_header.app_data1=0;
bmp_header.app_data2=0;
dib_header.dib_header_size=40;
dib_header.image_width=2;
dib_header.image_height=2;
dib_header.colour_depth=24;
dib_header.raw_image_size=16;
dib_header.horizontal_resolution=2835;
dib_header.vertical_resolution=2835;
dib_header.no_colour_planes=1;
dib_header.compression_method=0;
dib_header.num_colours_palette=0;
dib_header.imp_colours_used=0;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=255;
pixel_array[index++]=255;
pixel_array[index++]=255;
pixel_array[index++]=255;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=255;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=255;
pixel_array[index++]=0;
pixel_array[index++]=0;
pixel_array[index++]=0;
// Image Made
fstream file;
file.open ("abc.bmp",ios::out | ios::binary);
file.write ((char*)&bmp_header,sizeof (bmp_header));
file.write ((char*)&dib_header,sizeof (dib_header));
file.write ((char*)pixel_array,sizeof (pixel_array));
file.close ();
return 0;
}
c++ image bmp
c++ image bmp
edited Jan 3 at 5:55
Cœur
19.3k10116155
19.3k10116155
asked Jun 26 '14 at 17:12
PRPPRP
93921026
93921026
This code only ever puts one entry into thepixel_array
array here. You probably want to use a loop here so that you cover everyindex
in the array. Also I would strongly suggest using the c++ standard library containers, such asstd::vector
orstd::array
, over these raw arrays.
– shuttle87
Jun 26 '14 at 17:16
i have initialized all the elements of the pixel array....pls have a look...
– PRP
Jun 26 '14 at 17:18
1
Consider usingstruct
to make it abundantly clear thatBMP_Header
andDIB_Header
should be POD. Also consider putting the member-initializers directly on the member-declarations, so you can remove the custom constructor... Next, are you absolutely sure you need those casts tochar*
?
– Deduplicator
Jun 26 '14 at 17:21
Ok...will try doing so..btw what is POD....?
– PRP
Jun 26 '14 at 17:22
1
Besides all the rest, you should be using fixed width types, otherwise on another platform/compiler you risk messing up the memory layout due to different sizes types.
– Matteo Italia
Jun 26 '14 at 17:32
|
show 6 more comments
This code only ever puts one entry into thepixel_array
array here. You probably want to use a loop here so that you cover everyindex
in the array. Also I would strongly suggest using the c++ standard library containers, such asstd::vector
orstd::array
, over these raw arrays.
– shuttle87
Jun 26 '14 at 17:16
i have initialized all the elements of the pixel array....pls have a look...
– PRP
Jun 26 '14 at 17:18
1
Consider usingstruct
to make it abundantly clear thatBMP_Header
andDIB_Header
should be POD. Also consider putting the member-initializers directly on the member-declarations, so you can remove the custom constructor... Next, are you absolutely sure you need those casts tochar*
?
– Deduplicator
Jun 26 '14 at 17:21
Ok...will try doing so..btw what is POD....?
– PRP
Jun 26 '14 at 17:22
1
Besides all the rest, you should be using fixed width types, otherwise on another platform/compiler you risk messing up the memory layout due to different sizes types.
– Matteo Italia
Jun 26 '14 at 17:32
This code only ever puts one entry into the
pixel_array
array here. You probably want to use a loop here so that you cover every index
in the array. Also I would strongly suggest using the c++ standard library containers, such as std::vector
or std::array
, over these raw arrays.– shuttle87
Jun 26 '14 at 17:16
This code only ever puts one entry into the
pixel_array
array here. You probably want to use a loop here so that you cover every index
in the array. Also I would strongly suggest using the c++ standard library containers, such as std::vector
or std::array
, over these raw arrays.– shuttle87
Jun 26 '14 at 17:16
i have initialized all the elements of the pixel array....pls have a look...
– PRP
Jun 26 '14 at 17:18
i have initialized all the elements of the pixel array....pls have a look...
– PRP
Jun 26 '14 at 17:18
1
1
Consider using
struct
to make it abundantly clear that BMP_Header
and DIB_Header
should be POD. Also consider putting the member-initializers directly on the member-declarations, so you can remove the custom constructor... Next, are you absolutely sure you need those casts to char*
?– Deduplicator
Jun 26 '14 at 17:21
Consider using
struct
to make it abundantly clear that BMP_Header
and DIB_Header
should be POD. Also consider putting the member-initializers directly on the member-declarations, so you can remove the custom constructor... Next, are you absolutely sure you need those casts to char*
?– Deduplicator
Jun 26 '14 at 17:21
Ok...will try doing so..btw what is POD....?
– PRP
Jun 26 '14 at 17:22
Ok...will try doing so..btw what is POD....?
– PRP
Jun 26 '14 at 17:22
1
1
Besides all the rest, you should be using fixed width types, otherwise on another platform/compiler you risk messing up the memory layout due to different sizes types.
– Matteo Italia
Jun 26 '14 at 17:32
Besides all the rest, you should be using fixed width types, otherwise on another platform/compiler you risk messing up the memory layout due to different sizes types.
– Matteo Italia
Jun 26 '14 at 17:32
|
show 6 more comments
2 Answers
2
active
oldest
votes
struct DIB_Header
{
public :
unsigned int dib_header_size;
int image_width;
int image_height;
short int no_colour_planes;
short int colour_depth;
unsigned int compression_method;
unsigned int raw_image_size;
unsigned int horizontal_resolution;
unsigned int vertical_resolution;
unsigned int num_colours_palette;
unsigned int imp_colours_used;
} __attribute__ ((packed));
This should eliminate the padding problem you are reporting, provided your elements are the appropriate size for the header (I didn't cross check). There is no problems handling bmp's in C/C++. YMMV depending on the compiler as each can handle the packed attribute slightly differently. You should be fins in this case however.
Also, be aware of the row padding that BMP files expect in the data elements. As per the format guidelines from http://en.wikipedia.org/wiki/BMP_file_format:
The bits representing the bitmap pixels are packed in rows. The size
of each row is rounded up to a multiple of 4 bytes (a 32-bit DWORD) by
padding.
add a comment |
You should not use C structs to read/write things like a BMP header, because the precise binary layout is not guaranteed: specially because of fields alignment and padding. There is also the issue of little-big endianess, which you must be aware.
A workaround is to include the compiler pragmas/settings to disable structs padding; a better alternative is to write each field explicitly.
Added: Even worse, as pointed in a comment, it's wrong to use C plain types (int
...) for fixed width fields; the actual width will depend on the platform. You should use int32_t
or something like that.
Actually, you can (mostly). Still, adding some static assertions would be a good idea...
– Deduplicator
Jun 26 '14 at 17:33
i read the article in wikepedia....all data that have to be entered in little-endian...so that should not be a problem here...so u mean to say that I wite each field separately in to the file....?
– PRP
Jun 26 '14 at 17:34
@Deduplicator : you're right, I changed "cannot" to "should not"
– leonbloy
Jun 26 '14 at 17:35
"that should not be a problem here" But your program would not work on a different architecture, that's (normally) bad. "so u mean to say that I write each field separately in to the file?" Yes
– leonbloy
Jun 26 '14 at 17:37
Padding stuff seems to be the problem that i identified....will try writing each field separately
– PRP
Jun 26 '14 at 17:53
|
show 3 more comments
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f24436515%2fprogrammatically-making-an-bmp-image%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
struct DIB_Header
{
public :
unsigned int dib_header_size;
int image_width;
int image_height;
short int no_colour_planes;
short int colour_depth;
unsigned int compression_method;
unsigned int raw_image_size;
unsigned int horizontal_resolution;
unsigned int vertical_resolution;
unsigned int num_colours_palette;
unsigned int imp_colours_used;
} __attribute__ ((packed));
This should eliminate the padding problem you are reporting, provided your elements are the appropriate size for the header (I didn't cross check). There is no problems handling bmp's in C/C++. YMMV depending on the compiler as each can handle the packed attribute slightly differently. You should be fins in this case however.
Also, be aware of the row padding that BMP files expect in the data elements. As per the format guidelines from http://en.wikipedia.org/wiki/BMP_file_format:
The bits representing the bitmap pixels are packed in rows. The size
of each row is rounded up to a multiple of 4 bytes (a 32-bit DWORD) by
padding.
add a comment |
struct DIB_Header
{
public :
unsigned int dib_header_size;
int image_width;
int image_height;
short int no_colour_planes;
short int colour_depth;
unsigned int compression_method;
unsigned int raw_image_size;
unsigned int horizontal_resolution;
unsigned int vertical_resolution;
unsigned int num_colours_palette;
unsigned int imp_colours_used;
} __attribute__ ((packed));
This should eliminate the padding problem you are reporting, provided your elements are the appropriate size for the header (I didn't cross check). There is no problems handling bmp's in C/C++. YMMV depending on the compiler as each can handle the packed attribute slightly differently. You should be fins in this case however.
Also, be aware of the row padding that BMP files expect in the data elements. As per the format guidelines from http://en.wikipedia.org/wiki/BMP_file_format:
The bits representing the bitmap pixels are packed in rows. The size
of each row is rounded up to a multiple of 4 bytes (a 32-bit DWORD) by
padding.
add a comment |
struct DIB_Header
{
public :
unsigned int dib_header_size;
int image_width;
int image_height;
short int no_colour_planes;
short int colour_depth;
unsigned int compression_method;
unsigned int raw_image_size;
unsigned int horizontal_resolution;
unsigned int vertical_resolution;
unsigned int num_colours_palette;
unsigned int imp_colours_used;
} __attribute__ ((packed));
This should eliminate the padding problem you are reporting, provided your elements are the appropriate size for the header (I didn't cross check). There is no problems handling bmp's in C/C++. YMMV depending on the compiler as each can handle the packed attribute slightly differently. You should be fins in this case however.
Also, be aware of the row padding that BMP files expect in the data elements. As per the format guidelines from http://en.wikipedia.org/wiki/BMP_file_format:
The bits representing the bitmap pixels are packed in rows. The size
of each row is rounded up to a multiple of 4 bytes (a 32-bit DWORD) by
padding.
struct DIB_Header
{
public :
unsigned int dib_header_size;
int image_width;
int image_height;
short int no_colour_planes;
short int colour_depth;
unsigned int compression_method;
unsigned int raw_image_size;
unsigned int horizontal_resolution;
unsigned int vertical_resolution;
unsigned int num_colours_palette;
unsigned int imp_colours_used;
} __attribute__ ((packed));
This should eliminate the padding problem you are reporting, provided your elements are the appropriate size for the header (I didn't cross check). There is no problems handling bmp's in C/C++. YMMV depending on the compiler as each can handle the packed attribute slightly differently. You should be fins in this case however.
Also, be aware of the row padding that BMP files expect in the data elements. As per the format guidelines from http://en.wikipedia.org/wiki/BMP_file_format:
The bits representing the bitmap pixels are packed in rows. The size
of each row is rounded up to a multiple of 4 bytes (a 32-bit DWORD) by
padding.
edited Jun 26 '14 at 20:37
answered Jun 26 '14 at 20:30
AumnayanAumnayan
66139
66139
add a comment |
add a comment |
You should not use C structs to read/write things like a BMP header, because the precise binary layout is not guaranteed: specially because of fields alignment and padding. There is also the issue of little-big endianess, which you must be aware.
A workaround is to include the compiler pragmas/settings to disable structs padding; a better alternative is to write each field explicitly.
Added: Even worse, as pointed in a comment, it's wrong to use C plain types (int
...) for fixed width fields; the actual width will depend on the platform. You should use int32_t
or something like that.
Actually, you can (mostly). Still, adding some static assertions would be a good idea...
– Deduplicator
Jun 26 '14 at 17:33
i read the article in wikepedia....all data that have to be entered in little-endian...so that should not be a problem here...so u mean to say that I wite each field separately in to the file....?
– PRP
Jun 26 '14 at 17:34
@Deduplicator : you're right, I changed "cannot" to "should not"
– leonbloy
Jun 26 '14 at 17:35
"that should not be a problem here" But your program would not work on a different architecture, that's (normally) bad. "so u mean to say that I write each field separately in to the file?" Yes
– leonbloy
Jun 26 '14 at 17:37
Padding stuff seems to be the problem that i identified....will try writing each field separately
– PRP
Jun 26 '14 at 17:53
|
show 3 more comments
You should not use C structs to read/write things like a BMP header, because the precise binary layout is not guaranteed: specially because of fields alignment and padding. There is also the issue of little-big endianess, which you must be aware.
A workaround is to include the compiler pragmas/settings to disable structs padding; a better alternative is to write each field explicitly.
Added: Even worse, as pointed in a comment, it's wrong to use C plain types (int
...) for fixed width fields; the actual width will depend on the platform. You should use int32_t
or something like that.
Actually, you can (mostly). Still, adding some static assertions would be a good idea...
– Deduplicator
Jun 26 '14 at 17:33
i read the article in wikepedia....all data that have to be entered in little-endian...so that should not be a problem here...so u mean to say that I wite each field separately in to the file....?
– PRP
Jun 26 '14 at 17:34
@Deduplicator : you're right, I changed "cannot" to "should not"
– leonbloy
Jun 26 '14 at 17:35
"that should not be a problem here" But your program would not work on a different architecture, that's (normally) bad. "so u mean to say that I write each field separately in to the file?" Yes
– leonbloy
Jun 26 '14 at 17:37
Padding stuff seems to be the problem that i identified....will try writing each field separately
– PRP
Jun 26 '14 at 17:53
|
show 3 more comments
You should not use C structs to read/write things like a BMP header, because the precise binary layout is not guaranteed: specially because of fields alignment and padding. There is also the issue of little-big endianess, which you must be aware.
A workaround is to include the compiler pragmas/settings to disable structs padding; a better alternative is to write each field explicitly.
Added: Even worse, as pointed in a comment, it's wrong to use C plain types (int
...) for fixed width fields; the actual width will depend on the platform. You should use int32_t
or something like that.
You should not use C structs to read/write things like a BMP header, because the precise binary layout is not guaranteed: specially because of fields alignment and padding. There is also the issue of little-big endianess, which you must be aware.
A workaround is to include the compiler pragmas/settings to disable structs padding; a better alternative is to write each field explicitly.
Added: Even worse, as pointed in a comment, it's wrong to use C plain types (int
...) for fixed width fields; the actual width will depend on the platform. You should use int32_t
or something like that.
edited Jun 26 '14 at 21:36
answered Jun 26 '14 at 17:28
leonbloyleonbloy
54k17107153
54k17107153
Actually, you can (mostly). Still, adding some static assertions would be a good idea...
– Deduplicator
Jun 26 '14 at 17:33
i read the article in wikepedia....all data that have to be entered in little-endian...so that should not be a problem here...so u mean to say that I wite each field separately in to the file....?
– PRP
Jun 26 '14 at 17:34
@Deduplicator : you're right, I changed "cannot" to "should not"
– leonbloy
Jun 26 '14 at 17:35
"that should not be a problem here" But your program would not work on a different architecture, that's (normally) bad. "so u mean to say that I write each field separately in to the file?" Yes
– leonbloy
Jun 26 '14 at 17:37
Padding stuff seems to be the problem that i identified....will try writing each field separately
– PRP
Jun 26 '14 at 17:53
|
show 3 more comments
Actually, you can (mostly). Still, adding some static assertions would be a good idea...
– Deduplicator
Jun 26 '14 at 17:33
i read the article in wikepedia....all data that have to be entered in little-endian...so that should not be a problem here...so u mean to say that I wite each field separately in to the file....?
– PRP
Jun 26 '14 at 17:34
@Deduplicator : you're right, I changed "cannot" to "should not"
– leonbloy
Jun 26 '14 at 17:35
"that should not be a problem here" But your program would not work on a different architecture, that's (normally) bad. "so u mean to say that I write each field separately in to the file?" Yes
– leonbloy
Jun 26 '14 at 17:37
Padding stuff seems to be the problem that i identified....will try writing each field separately
– PRP
Jun 26 '14 at 17:53
Actually, you can (mostly). Still, adding some static assertions would be a good idea...
– Deduplicator
Jun 26 '14 at 17:33
Actually, you can (mostly). Still, adding some static assertions would be a good idea...
– Deduplicator
Jun 26 '14 at 17:33
i read the article in wikepedia....all data that have to be entered in little-endian...so that should not be a problem here...so u mean to say that I wite each field separately in to the file....?
– PRP
Jun 26 '14 at 17:34
i read the article in wikepedia....all data that have to be entered in little-endian...so that should not be a problem here...so u mean to say that I wite each field separately in to the file....?
– PRP
Jun 26 '14 at 17:34
@Deduplicator : you're right, I changed "cannot" to "should not"
– leonbloy
Jun 26 '14 at 17:35
@Deduplicator : you're right, I changed "cannot" to "should not"
– leonbloy
Jun 26 '14 at 17:35
"that should not be a problem here" But your program would not work on a different architecture, that's (normally) bad. "so u mean to say that I write each field separately in to the file?" Yes
– leonbloy
Jun 26 '14 at 17:37
"that should not be a problem here" But your program would not work on a different architecture, that's (normally) bad. "so u mean to say that I write each field separately in to the file?" Yes
– leonbloy
Jun 26 '14 at 17:37
Padding stuff seems to be the problem that i identified....will try writing each field separately
– PRP
Jun 26 '14 at 17:53
Padding stuff seems to be the problem that i identified....will try writing each field separately
– PRP
Jun 26 '14 at 17:53
|
show 3 more comments
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f24436515%2fprogrammatically-making-an-bmp-image%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
This code only ever puts one entry into the
pixel_array
array here. You probably want to use a loop here so that you cover everyindex
in the array. Also I would strongly suggest using the c++ standard library containers, such asstd::vector
orstd::array
, over these raw arrays.– shuttle87
Jun 26 '14 at 17:16
i have initialized all the elements of the pixel array....pls have a look...
– PRP
Jun 26 '14 at 17:18
1
Consider using
struct
to make it abundantly clear thatBMP_Header
andDIB_Header
should be POD. Also consider putting the member-initializers directly on the member-declarations, so you can remove the custom constructor... Next, are you absolutely sure you need those casts tochar*
?– Deduplicator
Jun 26 '14 at 17:21
Ok...will try doing so..btw what is POD....?
– PRP
Jun 26 '14 at 17:22
1
Besides all the rest, you should be using fixed width types, otherwise on another platform/compiler you risk messing up the memory layout due to different sizes types.
– Matteo Italia
Jun 26 '14 at 17:32