Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <windows.h>
- struct _pal {
- unsigned char r;
- unsigned char g;
- unsigned char b;
- };
- struct _pal pal[256];
- BYTE* ConvertToBMP(BYTE* Buffer, int width, int height, long* newsize)
- {
- if ((NULL == Buffer) || (width == 0) || (height == 0))
- return NULL;
- int padding = 0;
- int scanlinebytes = width * 3;
- while ((scanlinebytes + padding) % 4 != 0)
- padding++;
- int psw = scanlinebytes + padding;
- *newsize = height * psw;
- BYTE* newbuf = (unsigned char *) malloc(*newsize);
- memset (newbuf, 0, *newsize);
- long bufpos = height * width * 4;
- long newpos = 0;
- int y = 0, x = 0;
- for(y = 0; y < height; y++) {
- for (x = 0; x < 3 * width; x+=3) {
- bufpos-=4;
- newbuf[newpos++] = Buffer[bufpos + 2];
- newbuf[newpos++] = Buffer[bufpos + 1];
- newbuf[newpos++] = Buffer[bufpos];
- }
- }
- return newbuf;
- }
- int SaveBMP(BYTE* Buffer, int width, int height, long paddedsize, char* bmpfile)
- {
- BITMAPFILEHEADER bmfh;
- BITMAPINFOHEADER info;
- memset (&bmfh, 0, sizeof(BITMAPFILEHEADER));
- memset (&info, 0, sizeof(BITMAPINFOHEADER));
- bmfh.bfType = 0x4d42;
- bmfh.bfReserved1 = 0;
- bmfh.bfReserved2 = 0;
- bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + paddedsize;
- bmfh.bfOffBits = 0x36;
- info.biSize = sizeof(BITMAPINFOHEADER);
- info.biWidth = width;
- info.biHeight = height;
- info.biPlanes = 1;
- info.biBitCount = 24;
- info.biCompression = BI_RGB;
- info.biSizeImage = 0;
- info.biXPelsPerMeter = 0x0ec4;
- info.biYPelsPerMeter = 0x0ec4;
- info.biClrUsed = 0;
- info.biClrImportant = 0;
- HANDLE file = CreateFile(bmpfile, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if (file == NULL) {
- CloseHandle(file);
- return 0;
- }
- unsigned long bwritten;
- if (WriteFile(file, &bmfh, sizeof(BITMAPFILEHEADER), &bwritten, NULL) == 0) {
- CloseHandle(file);
- return 0;
- }
- if (WriteFile(file, &info, sizeof(BITMAPINFOHEADER), &bwritten, NULL) == 0) {
- CloseHandle(file);
- return 0;
- }
- if (WriteFile(file, Buffer, paddedsize, &bwritten, NULL) == 0) {
- CloseHandle(file);
- return 0;
- }
- CloseHandle(file);
- return 1;
- }
- int main(int argc, char * argv[])
- {
- int w, h;
- sscanf(argv[2], "%i", &w);
- sscanf(argv[3], "%i", &h);
- printf("File %s, size %ix%i\n", argv[1], w, h);
- FILE * fp = fopen(argv[1], "rb");
- fseek(fp, 0, SEEK_END);
- int size = ftell(fp);
- rewind(fp);
- unsigned char * buffer = (unsigned char*) malloc (sizeof(char) * size);
- fread(buffer, 1, size, fp);
- fclose(fp);
- int palcount = 0, offset = 0;
- while(palcount < 256) {
- unsigned short extr = (buffer[offset+1] << 8) | buffer[offset];
- pal[palcount].r = (extr & 0xF000) >> 8;
- pal[palcount].g = ((extr & 0x0F00)) >> 4;
- pal[palcount].b = ((extr & 0x00F0));
- printf("%i: %04x -> %i %i %i\n", palcount, extr, pal[palcount].r, pal[palcount].g, pal[palcount].b);
- palcount++;
- offset+=2;
- }
- unsigned char * imgbuffer = (unsigned char*) malloc (sizeof(char) * w * h * 4);
- int imgoffset = 0;
- while(offset < size) {
- unsigned char raw = buffer[offset];
- imgbuffer[imgoffset] = pal[raw].r;
- imgbuffer[imgoffset+1] = pal[raw].g;
- imgbuffer[imgoffset+2] = pal[raw].b;
- imgbuffer[imgoffset+3] = 0xFF;
- offset++;
- imgoffset+=4;
- }
- long bmpsize = 0;
- unsigned char * bmpbuffer = ConvertToBMP(imgbuffer, w, h, &bmpsize);
- SaveBMP(bmpbuffer, w, h, bmpsize, "image.bmp");
- free(buffer);
- free(imgbuffer);
- free(bmpbuffer);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment