Делал в своё время класс для работы с монохромным изображением. Тут, как я понял, нужно тоже самое.
Bitmap_mono.hCODE
#ifndef _CCBITMAP_MONO_H
#define _CCBITMAP_MONO_H
// Типы данных
#ifndef TYPES_DEFINED
#define TYPES_DEFINED
typedef signed long long int64;
typedef signed int int32;
typedef signed short int int16;
typedef signed char int8;
typedef unsigned long long uint64;
typedef unsigned int uint32;
typedef unsigned short int uint16;
typedef unsigned char uint8;
#endif
class CBITMAP_MONO
{
private:
uint8 *buf;
uint32 width;
uint32 height;
public:
CBITMAP_MONO(void);
~CBITMAP_MONO(void);
uint32 bind(uint8 *new_buf, uint32 new_width, uint32 new_height);
void clear(uint32 color);
void invert();
void set_pixel(uint32 x, uint32 y, uint32 color);
uint32 get_pixel(uint32 x, uint32 y);
};
#endif
Bitmap_mono.cppCODE
//------------------------------------------------------------------------------
#include "Bitmap_mono.h"
//------------------------------------------------------------------------------
CBITMAP_MONO::CBITMAP_MONO(void)
{
buf = 0;
}
//------------------------------------------------------------------------------
CBITMAP_MONO::~CBITMAP_MONO(void)
{
}
//------------------------------------------------------------------------------
uint32 CBITMAP_MONO::bind(uint8 *new_buf, uint32 new_width, uint32 new_height)
{
if(new_buf == 0) return 0;
if(new_width == 0) return 0;
if(new_height == 0) return 0;
buf = new_buf;
width = new_width;
height = new_height;
return 1;
}
//------------------------------------------------------------------------------
void CBITMAP_MONO::clear(uint32 color)
{
uint32 size = width * height / 8;
if((width * height) % 8) size++;
if(color)
{
for(uint32 i = 0; i < size; i++) buf[i] = 0xFF;
}
else
{
for(uint32 i = 0; i < size; i++) buf[i] = 0x00;
}
}
//------------------------------------------------------------------------------
void CBITMAP_MONO::invert()
{
uint32 size = width * height / 8;
if((width * height) % 8) size++;
for(uint32 i = 0; i < size; i++) buf[i] = ~buf[i];
}
//------------------------------------------------------------------------------
void CBITMAP_MONO::set_pixel(uint32 x, uint32 y, uint32 color)
{
if(x >= width) return;
if(y >= height) return;
uint32 pix_num = y * width + x;
uint32 byte_num = pix_num / 8;
uint8 img_byte = buf[byte_num];
if(color)
{
img_byte |= 1 << (pix_num % 8);
buf[byte_num] = img_byte;
}
else
{
img_byte &= ~(1 << (pix_num % 8));
buf[byte_num] = img_byte;
}
}
//------------------------------------------------------------------------------
uint32 CBITMAP_MONO::get_pixel(uint32 x, uint32 y)
{
if(x >= width) return 0x000000;
if(y >= height) return 0x000000;
uint32 pix_num = y * width + x;
uint32 byte_num = pix_num / 8;
uint8 img_byte = buf[byte_num];
if(img_byte & (1 << (pix_num % 8))) return 0xFFFFFF;
else return 0x000000;
}
//------------------------------------------------------------------------------
Использование:
Код
const uint32 width = 20;
const uint32 height = 35;
uint8 buf[width * height / 8 + 1];
CBITMAP_MONO bmp;
bmp.bind(buf, width, height);
bmp.set_pixel(3, 14, 1);
if(bmp.get_pixel(3, 14))
{
// ....
}
Да, если хочется юзать STL, то там есть стандартный контейнер - bitset
http://www.cplusplus.com/reference/stl/bitset/Правда неизвестно как он реализован в IAR'е и сколько памяти будет занимать.