开发者

C++ creating image

I haven't been programming in C++ for a while, and now I have to write a simple thing, but it's driving me nuts.

I need to create a bitmap from a table of colors: char image[200][200][3];

First coordinate is width, second height, third colors开发者_C百科: RGB. How to do it?

Thanks for any help. Adam


I'm sure you've already checked http://en.wikipedia.org/wiki/BMP_file_format.

With that information in hand we can write a quick BMP with:

// setup header structs bmpfile_header and bmp_dib_v3_header before this (see wiki)
// * note for a windows bitmap you want a negative height if you're starting from the top *
// * otherwise the image data is expected to go from bottom to top *

FILE * fp = fopen ("file.bmp", "wb");
fwrite(bmpfile_header, sizeof(bmpfile_header), 1, fp);
fwrite(bmp_dib_v3_header, sizeof(bmp_dib_v3_header_t), 1, fp);

for (int i = 0; i < 200; i++)  {
 for (int j = 0; j < 200; j++) {
  fwrite(&image[j][i][2], 1, 1, fp);
  fwrite(&image[j][i][1], 1, 1, fp);
  fwrite(&image[j][i][0], 1, 1, fp);
 }
}

fclose(fp);

If setting up the headers is a problem let us know.

Edit: I forgot, BMP files expect BGR instead of RGB, I've updated the code (surprised nobody caught it).


I'd suggest ImageMagick, comprehensive library etc.


I would first try to find out, how the BMP file format (that's what you mean by a bitmap, right?) is defined. Then I would convert the array to that format and print it to the file.

If that's an option, I would also consider trying to find an existing library for BMP files creation, and just use it.

Sorry if what I said is already obvious for you, but I don't know on which stage of the process you are stuck.


For simple image operations I highly recommend Cimg. This library works like a charm, and is extremely easy to use. You just have to include a header file in your code. It literally took me less than 10 minutes to compile and test.

If you want to do more complicated image operations however, I would go with Magick++ as suggested by dagoof.


It would be advisable to initialise the function as a simple 1 dimensional array.

ie (Where bytes is the number of bytes per pixel)

 char image[width * height * bytes];

You can then access the relevant position in the array as follows

 char byte1 = image[(x * 3) + (y * (width * bytes)) + 0];
 char byte2 = image[(x * 3) + (y * (width * bytes)) + 1];
 char byte3 = image[(x * 3) + (y * (width * bytes)) + 2];
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜