Bitmap Data Creation Function in C++
This snippet defines a function `createBmpData` that creates and initializes a BMP structure from a source image. It includes memory allocation and handles flipping the image if necessary.unknown
c_cpp
a year ago
3.0 kB
5
Indexable
uint8_t* createBmpData(uint8_t* srcImage, int width, int height, size_t* size);
uint8_t* createBmpData(uint8_t* srcImage, int width, int height, size_t* size)
{
// Bitmap Init
BMP bmp = new_BMP();
BMP_init(&bmp, width, height);
// Stream to bmp
Stream_to_BMP(&bmp, srcImage, BGR);
// Flipped
bool isFlipped = true;
if (isFlipped)
{
img_flipped_JY(bmp.data, bmp.infoHeader.biWidth, bmp.infoHeader.biHeight, 3);
}
size_t buflen = (54 + width * height * 3) * sizeof(uint8_t);
uint8_t* buf = (uint8_t*)malloc(buflen);
if (buf == 0) {
return nullptr;
*size = 0;
}
*size = buflen;
memset(buf, 0, buflen);
uint8_t* cur = buf;
memcpy(cur, &bmp.fileHeader.bfType, sizeof(bmp.fileHeader.bfType));
cur += sizeof(bmp.fileHeader.bfType);
memcpy(cur, &bmp.fileHeader.bfSize, sizeof(bmp.fileHeader.bfSize));
cur += sizeof(bmp.fileHeader.bfSize);
memcpy(cur, &bmp.fileHeader.bfReserved1, sizeof(bmp.fileHeader.bfReserved1));
cur += sizeof(bmp.fileHeader.bfReserved1);
memcpy(cur, &bmp.fileHeader.bfReserved2, sizeof(bmp.fileHeader.bfReserved2));
cur += sizeof(bmp.fileHeader.bfReserved2);
memcpy(cur, &bmp.fileHeader.bfOffBits, sizeof(bmp.fileHeader.bfOffBits));
cur += sizeof(bmp.fileHeader.bfOffBits);
memcpy(cur, &bmp.infoHeader.biSize, sizeof(bmp.infoHeader.biSize));
cur += sizeof(bmp.infoHeader.biSize);
memcpy(cur, &bmp.infoHeader.biWidth, sizeof(bmp.infoHeader.biWidth));
cur += sizeof(bmp.infoHeader.biWidth);
memcpy(cur, &bmp.infoHeader.biHeight, sizeof(bmp.infoHeader.biHeight));
cur += sizeof(bmp.infoHeader.biHeight);
memcpy(cur, &bmp.infoHeader.biPlanes, sizeof(bmp.infoHeader.biPlanes));
cur += sizeof(bmp.infoHeader.biPlanes);
memcpy(cur, &bmp.infoHeader.biBitCount, sizeof(bmp.infoHeader.biBitCount));
cur += sizeof(bmp.infoHeader.biBitCount);
memcpy(cur, &bmp.infoHeader.biCompression, sizeof(bmp.infoHeader.biCompression));
cur += sizeof(bmp.infoHeader.biCompression);
memcpy(cur, &bmp.infoHeader.biSizeImage, sizeof(bmp.infoHeader.biSizeImage));
cur += sizeof(bmp.infoHeader.biSizeImage);
memcpy(cur, &bmp.infoHeader.biXPelsPerMeter, sizeof(bmp.infoHeader.biXPelsPerMeter));
cur += sizeof(bmp.infoHeader.biXPelsPerMeter);
memcpy(cur, &bmp.infoHeader.biYPelsPerMeter, sizeof(bmp.infoHeader.biYPelsPerMeter));
cur += sizeof(bmp.infoHeader.biYPelsPerMeter);
memcpy(cur, &bmp.infoHeader.biClrUsed, sizeof(bmp.infoHeader.biClrUsed));
cur += sizeof(bmp.infoHeader.biClrUsed);
memcpy(cur, &bmp.infoHeader.biClrImportant, sizeof(bmp.infoHeader.biClrImportant));
cur += sizeof(bmp.infoHeader.biClrImportant);
memcpy(cur, bmp.data, sizeof(uint8_t) * bmp.infoHeader.biSizeImage);
free(bmp.colorPalette);
free(bmp.data);
return buf;
}
uint8_t* DitherProcessor::GetCurrentImage(size_t* length)
{
uint8_t* bmpData = createBmpData(current_image.get(), width, height, &bmp_data_len);
current_bmp_data.reset(bmpData);
*length = bmp_data_len;
return current_bmp_data.get();
}Editor is loading...
Leave a Comment