zoukankan      html  css  js  c++  java
  • 24位位图bmp转换为字符

     1  #include <cstdio>
     2  #include <cstring>
     3  #include <stdint.h>
     4  #include <windows.h>
     5  int32_t width,height;
     6  RGBQUAD *pixels;
     7  bool OpenBitmap(char const *filename)
     8  {
     9      FILE *file = fopen(filename, "rb");
    10      if (file)
    11      {
    12          width=0;
    13          height=0;
    14          BITMAPFILEHEADER bf;
    15          BITMAPINFOHEADER bi;
    16          fread(&bf, sizeof(bf), 1, file);
    17          fread(&bi, sizeof(bi), 1, file);
    18          if(bi.biBitCount!=24)
    19              return false;
    20          if(bi.biCompression!=BI_RGB)
    21              return false;
    22          width=bi.biWidth;
    23          height=bi.biHeight;
    24          pixels=new RGBQUAD[width*height];
    25          uint32_t rowSize = (bi.biBitCount * width + 31) / 32 * 4;
    26          uint8_t *line = new uint8_t[rowSize];
    27          for (int y = 0; y < height; y++)
    28          {
    29              fread(line, rowSize, 1, file);
    30              for (int x = 0; x < width; x++)
    31              {
    32                  uint8_t *color = line + x * 3;
    33                  RGBQUAD *pixel = &pixels[(height-y-1) * width+x];
    34                  pixel->rgbBlue  = color[0];
    35                  pixel->rgbGreen = color[1];
    36                  pixel->rgbRed   = color[2];
    37              }
    38          }
    39          delete[] line;
    40          fclose(file);
    41          return true;
    42      }
    43      return false;
    44  }
    45  RGBQUAD GetColor(int x, int y, int w, int h)
    46  {
    47      int r = 0, g = 0, b = 0;
    48      for (int i = 0; i < w; i++)
    49      {
    50          if (i + x >= width) continue;
    51          for (int j = 0; j < h; j++)
    52          {
    53              if (j + y >= height) continue;
    54              RGBQUAD const& color = pixels[(y + j) * width + (x + i)];
    55              r += color.rgbRed;
    56              g += color.rgbGreen;
    57              b += color.rgbBlue;
    58          }
    59      }
    60      return RGBQUAD{r / (w * h), g / (w * h),b / (w * h)};
    61  }
    62  char ColorToCharacter(RGBQUAD const& color)
    63  {
    64      int brightness = (color.rgbRed + color.rgbGreen + color.rgbBlue) / 3;
    65      static char const *characters = "Qo0V1;:*-. ";
    66      int len = strlen(characters);
    67      int span = 0xFF / len;
    68      int cidx = brightness / span;
    69      if (cidx == len)
    70          cidx--;
    71      return characters[cidx];
    72  }
    73  void OutputAscii(const char* filename, int w, int h)
    74  {
    75      FILE *file=fopen(filename,"a+");
    76      int x = width  / w;
    77      int y = height / h;
    78      for (int i = 0; i < height; i += y)
    79      {
    80          for (int j = 0; j < width; j += x)
    81          {
    82              RGBQUAD color = GetColor(j, i, x, y);
    83              fprintf(file, "%c", ColorToCharacter(color));
    84              //printf("%c", ColorToCharacter(color));
    85          }
    86          fprintf(file, "
    ");
    87          //printf("
    ");
    88      }
    89      delete [] pixels;
    90      fclose(file);
    91  }
    92  int main()
    93  {
    94       if(OpenBitmap("a.bmp"))
    95          OutputAscii("a.txt",width/6,height/12);
    96      return 0;
    97  }
    
  • 相关阅读:
    mysql_fullindex全文索引
    MySQL8.0.12安装主从复制读写分离
    备库不能应用事务&Slave_SQL_Running No
    MySQL8.0.19_Group_Replication分布式集群部署
    MySQL8.0.12_InnoDB_Cluster
    oracle12c备份恢复策略
    CentOS7.X静默安装Oracle12C
    binlog恢复数据
    windows安装多个mysql&Docker安装MySQL5.7
    论自我要求
  • 原文地址:https://www.cnblogs.com/CodeMIRACLE/p/5503753.html
Copyright © 2011-2022 走看看