Ну, поскольку растровые изображения - это такие простые файлы, вы можете просто прочитать заголовок и построить массив / вектор пикселей и отредактировать их.
Вот функция, которую я написал давно, хотя она заполненаплохие привычки кодирования.
m_imagefile - это базовая структура с важной информацией об изображении, такой как ширина, высота, bpp, формат и необработанный массив байтов.
m_imagefile *loadBMP(char *Filename) {
FILE *BMPFile=NULL;
errno_t error;
m_imagefile *IMG=NULL;
error=fopen_s(&BMPFile, Filename, "rb");
if(error!=0) {
return NULL;
}
IMG=new m_imagefile;
GLshort magic=0;
fseek(BMPFile, 0x00, SEEK_SET);
fread(&magic, sizeof(GLshort), 1, BMPFile);
fseek(BMPFile, 0x12, SEEK_SET);
fread(&IMG->width, sizeof(GLint), 1, BMPFile);
fseek(BMPFile, 0x16, SEEK_SET);
fread(&IMG->height, sizeof(GLint), 1, BMPFile);
fseek(BMPFile, 0x1C, SEEK_SET);
fread(&IMG->bpp, sizeof(GLshort), 1, BMPFile);
//First 2 bytes should be 0x424d or "BM" in ASCII
if(IMG->width == 0 || IMG->height == 0 || !(magic & 0x424D)) {
fclose(BMPFile);
delete IMG;
return NULL;
}
//Bitmaps are stored as BGR, not RGB
if(IMG->bpp==24) {
IMG->format = GL_BGR_EXT;
} else if(IMG->bpp==32) {
IMG->format = GL_BGRA_EXT;
} else {
fclose(BMPFile);
delete IMG;
return NULL;
}
IMG->data=new GLubyte[IMG->height*IMG->width*IMG->bpp/8];
fseek(BMPFile, 54, SEEK_SET);
fread(IMG->data, sizeof(GLbyte), IMG->height*IMG->width*IMG->bpp/8, BMPFile);
fclose(BMPFile);
return IMG;
}