Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2018
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.82 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <memory>
  5. #include <utility>
  6.  
  7. #pragma pack(push,1)
  8. struct BMP_FILE_HEADER {
  9.     uint16_t bfType;
  10.     uint32_t bfSize;
  11.     uint16_t bfReserved1;
  12.     uint16_t bfReserved2;
  13.     uint32_t bfOffBits;
  14. };
  15.  
  16. struct BITMAPCOREHEADER {
  17.     uint32_t bcSize;
  18.     uint16_t bcWidth;
  19.     uint16_t bcHeight;
  20.     uint16_t bcPlanes;
  21.     uint16_t bcBitCount;
  22. };
  23.  
  24. struct BITMAPINFOHEADER {
  25.     uint32_t bcSize;
  26.     int32_t biWidth;
  27.     int32_t biHeight;
  28.     uint16_t biPlanes;
  29.     uint16_t biBitCount;
  30.     uint32_t biCompression;
  31.     uint32_t biSizeImage;
  32.     int32_t biXPelsPerMeter;
  33.     int32_t biYPelsPerMeter;
  34.     uint32_t biClrUsed;
  35.     uint32_t biClrImportant;
  36. };
  37. #pragma pack(pop)
  38.  
  39. template<typename T>
  40. void readFile(std::ifstream& file, T* rv) {
  41.     file.read(reinterpret_cast<char*>(rv), sizeof(T));
  42. }
  43.  
  44. template<typename T>
  45. void writeFile(std::ofstream& file, T* rv) {
  46.     file.write(reinterpret_cast<char*>(rv), sizeof(T));
  47. }
  48.  
  49. void makeBmp(std::ifstream& inf, std::ofstream& outf, int32_t width, int32_t height) {
  50.     const uint32_t size = width*2*height*3;
  51.     BMP_FILE_HEADER writeFileHeader {
  52.         0x4D42,
  53.         size + sizeof(BMP_FILE_HEADER) + sizeof(BITMAPINFOHEADER),
  54.         0,
  55.         0,
  56.         sizeof(BMP_FILE_HEADER) + sizeof(BITMAPINFOHEADER)
  57.     };
  58.     writeFile(outf, &writeFileHeader);
  59.     BITMAPINFOHEADER writeHeader {
  60.         sizeof(BITMAPINFOHEADER),
  61.         width * 2,
  62.         height,
  63.         1,
  64.         24,
  65.         0,
  66.         size,
  67.         0,
  68.         0,
  69.         0,
  70.         0
  71.     };
  72.     writeFile(outf, &writeHeader);
  73.     std::unique_ptr<char[]> in_line{new char[width*3]};
  74.     std::unique_ptr<char[]> out_line{new char[width*2*3]};
  75.     for(auto cHeight = 0; cHeight <= height; ++cHeight) {
  76.         inf.read(in_line.get(), width*3);
  77.         memcpy(out_line.get(), in_line.get(), width*3);
  78.         char* in = in_line.get();
  79.         char* out = out_line.get() + width*3;
  80.         for(auto i = 0; i < width; ++i) {
  81.             out[i*3] = in[(width - i)*3 - 3];
  82.             out[i*3 + 1] = in[(width - i)*3 - 2];
  83.             out[i*3 + 2] = in[(width - i)*3 - 1];
  84.         }
  85.         outf.write(out_line.get(), width*2*3);
  86.     }
  87.     outf.close();
  88. }
  89.  
  90. int main() {
  91.     std::ifstream in("A:\\files\\123.bmp", std::ios::binary);
  92.     std::ofstream out("A:\\files\\1234.bmp", std::ios::binary);
  93.     if(!in.is_open()) {
  94.         return 1;
  95.     }
  96.     BMP_FILE_HEADER fileHeader;
  97.     readFile(in, &fileHeader);
  98.     if(fileHeader.bfType != 0x4D42) {
  99.         return 1;
  100.     }
  101.  
  102.     uint32_t size;
  103.     readFile(in, &size);
  104.     in.seekg(0x0E);
  105.     switch(size) {
  106.     case 12: {
  107.         BITMAPCOREHEADER header;
  108.         readFile(in, &header);
  109.         if(header.bcBitCount != 24) {
  110.             return 1;
  111.         }
  112.         in.seekg(fileHeader.bfOffBits);
  113.         makeBmp(in, out, header.bcWidth, header.bcHeight);
  114.     }
  115.     default: {
  116.         BITMAPINFOHEADER header;
  117.         readFile(in, &header);
  118.         if(header.biCompression != 0 || header.biClrUsed != 0 || header.biBitCount != 24) {
  119.             return 1;
  120.         }
  121.         in.seekg(fileHeader.bfOffBits);
  122.         makeBmp(in, out, header.biWidth, header.biHeight);
  123.     }
  124.     }
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement