Advertisement
Guest User

Untitled

a guest
Jul 17th, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.89 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <stdint.h>
  4. #include <string.h>
  5.  
  6. #pragma pack(push, 1)
  7. typedef struct BmHeader{
  8.     uint8_t  ID[2];
  9.     uint32_t file_size, reserved, offset;
  10. } BmHeader;
  11.  
  12. typedef struct BmInfoHeader{
  13.     uint32_t size, width, height;
  14.     uint16_t  planes, bpp;
  15.     uint32_t compession, image_size, unused[2], colors, important;
  16. } BmInfoHeader;
  17. #pragma pack(pop)
  18.  
  19. #define debug 0
  20. #if debug
  21. #define log(fnt, ...) fprintf(stderr, fnt "\n", __VA_ARGS__)
  22. #else
  23. #define log(...)
  24. #endif
  25.  
  26. int main(int args, char const *argv[]) {
  27.  
  28.     if (args < 3)
  29.     {
  30.         printf("%s <bmp in> <bmp out>", argv[0]);
  31.         exit(1);
  32.     }
  33.     FILE *fr = fopen(argv[1], "rb");
  34.     FILE *fw = fopen(argv[2], "wb");
  35.  
  36.     BmHeader bh;
  37.     BmInfoHeader bih;
  38.  
  39.     fread(&bh, sizeof(BmHeader), 1, fr);
  40.     fread(&bih.size, sizeof(unsigned int), 1, fr);
  41.     fread(&bih.width, bih.size - 4, 1, fr);
  42.  
  43.     if (bih.size != 40 || bih.planes != 1 || bih.compession > 2){
  44.         printf("Bmp file corrupted\n");
  45.         exit(2);
  46.     }
  47.     if (bih.bpp != 24)
  48.     {
  49.         printf("bpp %d not supported\n", bih.bpp);
  50.         exit(3);
  51.     }
  52.  
  53.     log("fsize %d, offset 0x%x",bh.file_size, bh.offset);
  54.     log("bpp %hd, compress %d, colors used %d",
  55.         bih.bpp, bih.compession, bih.colors);
  56.  
  57.     unsigned int bufwidth = bih.width, bufheight = bih.height;
  58.  
  59.     fwrite(&bh, sizeof(BmHeader), 1, fw);
  60.     fwrite(&bih, bih.size, 1, fw);
  61.  
  62.     char *buffer = malloc(bh.offset - (sizeof(BmHeader) + bih.size));
  63.     fread(buffer, bh.offset - (sizeof(BmHeader) + bih.size), 1, fr);
  64.     fwrite(buffer, bh.offset - (sizeof(BmHeader) + bih.size), 1, fw);
  65.     free(buffer);
  66.  
  67.     buffer = malloc(bih.image_size);
  68.     fread(buffer, bih.image_size, 1, fr);
  69.  
  70.     unsigned char bpp = bih.bpp / 8;
  71.  
  72.     for (int i = 0; i < bufheight / 2; i++) {
  73.         for (int j = 0; j < bufwidth * bpp; j++) {
  74.             char tmp = buffer[bpp * i * bufwidth + j];
  75.             buffer[bpp * i * bufwidth + j] = buffer[bpp * bufwidth * (bufheight - i - 1) + j];
  76.             buffer[bpp *  bufwidth * (bufheight - i - 1) + j] = tmp;
  77.         }
  78.     }
  79.  
  80.     char exbuf[6];
  81.  
  82.     for (int i = 0; i < bufheight; i++) {
  83.         for (int j = 0; j < bufwidth / 2; j++) {
  84.             memcpy(exbuf, (&buffer[bpp * i * bufwidth + bpp * j]), bpp);
  85.             memcpy(&buffer[bpp * i * bufwidth + bpp * j], &buffer[bpp * i * bufwidth + bpp * (bufwidth - 1 - j)], bpp);
  86.             memcpy(&buffer[bpp * i * bufwidth + bpp * (bufwidth - 1 - j)], exbuf, bpp);
  87.         }
  88.     }
  89.     fwrite(buffer, bih.image_size, 1, fw);
  90.  
  91.     free(buffer);
  92.  
  93.     buffer = malloc(bh.file_size - bh.offset - bih.image_size);
  94.  
  95.     fread(buffer, 1, bh.file_size - bh.offset - bih.image_size, fr);
  96.     fwrite(buffer, 1, bh.file_size - bh.offset - bih.image_size, fw);
  97.  
  98.     free(buffer);
  99.  
  100.     fclose(fr);
  101.     fclose(fw);
  102.  
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement