二值化图片数据解码显示(Grayscale8、Grayscale16、RGB888)————附带Qt版完整代码

1 效果

显示效果:
在这里插入图片描述

二值化后的图片数据:
原始数据信息:

\x00\x1F\x8F\xFF\xFF\xFF\xFF\xFF\xE0\x00\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x00\x0F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x00?\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x00?\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\x0F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x1F\xFF\xFF\xFF\xFF\xFC\x01\xFF\xFF\xFF\x1F\xFF\xFF\xFF\xFF\xE0\x00?\xFF\xFF\x07\xFF\xFF\xFF\xFF\x00\xF8\x0F\xFF\xFF\x07\xFF\xFF\xFF\xFE\x0E\x03\x83\xFF\xFF\x03\xFF\xFF\xFF\xF8 \x00"“a\xFF\xFF\x01\xFF\xFF\xFF\xF0\xC0\x00\x18\xFF\xFF\x00\xFF\xFF\xFF\xE1\x07\x8F\f\x7F\xFF\x00?\xFF\xFF\xC6\r\x9F\x06?\xFF\x00\x7F\xFF\xFF\xCC\x19\x99\x81\x1F\xFF\x01\xFF\xFF\xFF\x88\f\x91\x00\x8F\xFE\x03\xFF\xFF\xFF\x11\xCC\x93\x10\x8F\xFF\x0F\xFF\xFF\xFF#\xC0\x02>G\xFF?\xFF\xFF\xFE”`\xE0"“fG\xFF?\xFF\xFF\xFEG\x02\f\x06#\xBF?\xFF\xFF\xFE”"C\x88\x02\f#\xFF\x7F\xFF\xFF\xFC@\x11\xC1\x18"“3\xFF\xFF\xFF\xFF\xFC\x80\x03\xC8\x00\x13\xFF\x07\xFF\xFF\xFC\x8E \f\x80\x11\xFF\x07\xFF\xFF\xFC\x98\fL\x9F\x11\xFF\x03\xFF\xFF\xFC\x90\f\xE0\x83\x11\xFF\x00\x7F\xFF\xFC\x98\f\xE0\x81\x91\xFF\x00?\xFF\xFC\x8E\bL\x81\x91\xFF\x00?\xFF\xFC\x80 \f\x0F\x11\xFF\x00\x7F\xFF\xFC\x80\x03\x98\x00\x11\xFF\x00\x7F\xFF\xFC\x83\x11\x80\x00\x03\xFF\x00\xFF\xFF\xFC”"F\b\x00"“0\x03\xFF\x00\xFF\xFF\xFE”“D@\x00\x1C\x03\xFF\x00\xFF\xFF\xFE”"D\xC0@\x8C\x07\xFF\x01\xFF\xFF\xFE’\x80\x00\xCC\x07\xFF\x01\xFF\xFF\xFF\x00\x10\x00x\x07\xFF\x0F\xFF\xFF\xFF\x10""0&\x00\x0F\xFC\x04\x7F\xFF\xFF\x88"“2&\x00\x0F\xFC\xFF\xFF\xFF\xFF\xC4\x12”\x00\x1F\xFE\xFF\xFF\xFF\xFF\xC2\x1C<\x00?\xFF\xFF\xFF\xFF\xFF\xE1\x00\x00\x00\x7F\xFF\xFF\xFF\xFF\xFF\xF0@\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x00\x00\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFE\x01\xF0\x03\xFF\xFF\xFF\xFF\x80\xFF\xFF\x00\x00\x0F\xFF\xFF\xFF\xC0\x0F\xFF\xFF\xE0\x00?\xFF\xFF\xF8\x01\x7F\xF1\xFF\xFC\x03\xFF\xFF\xFF\x00?\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\x07\xFF\xFE\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x00\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFE\x00\x00\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x00\x00\x7F\xFF\xFF\xFF\xFF\xE0\xFF\xF0\x00\x00\x7F\xFF\xFF\xFF\xFC\x00\xFF\x80\x00\x00?\xFF\xFF\xFF\xC0\x00\xFE\x00\x00\x00?\xFF\xFF\xF8\x00\x00\xF8\x00\x00\x00?\xFF\xFF\x00\x00\x00\xC0\x00\x00\x00\x1F\xFF\xF0\x00\x00\x00\x80\x00\x00\x00\x1F\xFE\x00\x00\x00\x00

转换为16进制后显示的图片数据信息:
00 1F 8F FF FF FF FF FF E0 00 01 FF FF FF FF FF FF FF F0 00 0F FF FF FF FF FF FF FF F0 00 3F FF FF FF FF FF FF FF F0 00 3F FF FF FF FF FF FF FF FF 7F 0F FF FF FF FF FF FF FF FF F8 1F FF FF FF FF FC 01 FF FF FF 1F FF FF FF FF E0 00 3F FF FF 07 FF FF FF FF 00 F8 0F FF FF 07 FF FF FF FE 0E 03 83 FF FF 03 FF FF FF F8 20 00 61 FF FF 01 FF FF FF F0 C0 00 18 FF FF 00 FF FF FF E1 07 8F 0C 7F FF 00 3F FF FF C6 0D 9F 06 3F FF 00 7F FF FF CC 19 99 81 1F FF 01 FF FF FF 88 0C 91 00 8F FE 03 FF FF FF 11 CC 93 10 8F FF 0F FF FF FF 23 C0 02 3E 47 FF 3F FF FF FE 22 60 E0 66 47 FF 3F FF FF FE 47 02 0C 06 23 BF 3F FF FF FE 43 88 02 0C 23 FF 7F FF FF FC 40 11 C1 18 33 FF FF FF FF FC 80 03 C8 00 13 FF 07 FF FF FC 8E 20 0C 80 11 FF 07 FF FF FC 98 0C 4C 9F 11 FF 03 FF FF FC 90 0C E0 83 11 FF 00 7F FF FC 98 0C E0 81 91 FF 00 3F FF FC 8E 08 4C 81 91 FF 00 3F FF FC 80 20 0C 0F 11 FF 00 7F FF FC 80 03 98 00 11 FF 00 7F FF FC 83 11 80 00 03 FF 00 FF FF FC 46 08 00 30 03 FF 00 FF FF FE 44 40 00 1C 03 FF 00 FF FF FE 44 C0 40 8C 07 FF 01 FF FF FE 27 80 00 CC 07 FF 01 FF FF FF 00 10 00 78 07 FF 0F FF FF FF 10 30 26 00 0F FC 04 7F FF FF 88 32 26 00 0F FC FF FF FF FF C4 12 22 00 1F FE FF FF FF FF C2 1C 3C 00 3F FF FF FF FF FF E1 00 00 00 7F FF FF FF FF FF F0 40 00 00 FF FF FF FF FF FF F8 00 00 01 FF FF FF FF FF FF FE 01 F0 03 FF FF FF FF 80 FF FF 00 00 0F FF FF FF C0 0F FF FF E0 00 3F FF FF F8 01 7F F1 FF FC 03 FF FF FF 00 3F FF 00 FF FF FF FF FF FF 07 FF FE 00 FF FF FF FF FF FF FF FF F8 00 FF FF FF FF FF FF FF FF E0 00 FF FF FF FF FF FF FF FF 80 00 7F FF FF FF FF FF FF FE 00 00 7F FF FF FF FF FF FF F8 00 00 7F FF FF FF FF E0 FF F0 00 00 7F FF FF FF FC 00 FF 80 00 00 3F FF FF FF C0 00 FE 00 00 00 3F FF FF F8 00 00 F8 00 00 00 3F FF FF 00 00 00 C0 00 00 00 1F FF F0 00 00 00 80 00 00 00 1F FE 00 00 00 00

2 思路

二值化后的图片数据为:每像素占1bite(1位)。
为了显示,我们需要把图片信息还原为软件可以显示的格式,比如我现在还原的格式就是QImage::Format_Grayscale8,即每像素占8位的格式。

背景:二值化的图片信息是每像素占一位。0代表黑,1代表白。
方法:

  • 1 根据图片数据的信息,图片占600的字节,即4800位,因此创建一个一维的容量为4800无符号数组,
  • 2 读取图片每位的像素信息,
  • 3 从低位到高位与1进行与操作(使用逻辑移位>>)
    • 如果是1,则无符号数组中填充0xFF,两个十六进制数(即8位),即把1位每像素还原为8位每像素;
    • 如果是0,则无符号数组中填充0x00;
    • 填充的方法为:
      • 法1:根据宽、高分别为80和60,每一行数据代表一个宽,行数代表高,每一行满80(宽的个数==80),则换下一行(即高个数加1),在数组的位置标示为:宽长度(80)* 高个数 + 宽个数【用一位数组标示二维数组】
      • 法2:0到4800依次填充
  • 4 根据图片的格式显示图片

3 实现代码

读取数据

    //读数据到buffer
    QFile file("/Users/macbookpro/Documents/test9.txt");
    QByteArray imgData;
     if(file.open(QIODevice::ReadOnly)){//只读、二进制方式
         imgData = file.readAll();
         file.close();
     } 
     //转换为无符号数组
   unsigned char* tempImgContent = reinterpret_cast<unsigned char*>(imgData.data());
      int width = 80;
   int height = 60;
   unsigned char *binarydata = new unsigned char[width * height];// 每字节8位

法二:

   int pixCnt = 0;
   for(int i = 0; i < 600;i++){
       for(int j = 7; j >=0;j--){

           if(((tempImgContent[i]>>(j)) & 0x01) == 1){
               binarydata[pixCnt++] =  0xFF;//白(两个4位/一个16进制,共8位)
           }else{
                binarydata[pixCnt++] = 0x00;//黑
           }
       }
   }
   QImage imageData(binarydata, 80, 60,  QImage::Format_Grayscale8);

法一:

   int widthCnt = 0, heightCnt = 0;
   for(int i = 0; i < 600;i++){
       for(int j = 7; j >=0;j--){

           if(((tempImgContent[i]>>(j)) & 0x01) == 1){
               binarydata[heightCnt * 80 + widthCnt] =  0xFF;//白(两个4位/一个16进制,4位)
               widthCnt++;
               if(widthCnt == 80){
                   heightCnt++;
                   widthCnt = 0;
               }
           }else{
                binarydata[heightCnt * 80 + widthCnt] = 0x00;//黑
                widthCnt++;
                if(widthCnt == 80){
                    heightCnt++;
                    widthCnt = 0;
                }
           }
       }
   }
   QImage imageData(binarydata, 80, 60,  QImage::Format_Grayscale8);

4 扩展

4.1 RGB888

把二值化的图片数据转位24位每像素格式图片(即RGB每8位一像素)显示

思路:

  • 1 创建一个二维数组[高][宽];
  • 2 读取图片数据,给二维数组的每个元素赋值,与1进行与操作,相同取1,不同取0;
  • 3,根据宽、高、数据格式(QImage::Format_RGB888),使用构造函数创建QImage对象,
  • 4, 设置每个像素的值,如果是0,则赋予QColor(0,0,0),否则赋予QColor(255,255,255),同时赋予位置。
  • 5,调用QPixmap显示图片。

实现代码:
读取数据:

    //读数据到buffer
    QFile file("/Users/macbookpro/Documents/test9.txt");
    QByteArray imgData;
     if(file.open(QIODevice::ReadOnly)){//只读、二进制方式
         imgData = file.readAll();
         file.close();
     } 
```cpp

存储到二维无符号数组

    unsigned char *msrc = tempImgContent;
    unsigned char tmpsrc;
    unsigned char pix[60][80];//创建二维数组 高和宽
    for (int i = 0;i < 60; i++) {
        for(int j = 0; j < 80; j += 8) {
            tmpsrc = *msrc++;
            pix[i][j+0] = (tmpsrc >> 7) & 0x01;//与1进行与操作,相同取1,不同取0
            pix[i][j+1] = (tmpsrc >> 6) & 0x01;
            pix[i][j+2] = (tmpsrc >> 5) & 0x01;
            pix[i][j+3] = (tmpsrc >> 4) & 0x01;
            pix[i][j+4] = (tmpsrc >> 3) & 0x01;
            pix[i][j+5] = (tmpsrc >> 2) & 0x01;
            pix[i][j+6] = (tmpsrc >> 1) & 0x01;
            pix[i][j+7] = (tmpsrc >> 0) & 0x01;
        }
    }

根据图片格式绘制图片:

 int nWidth = 80, nHeight = 60;
    QImage imageData(nWidth, nHeight, QImage::Format_RGB888);
    for (int x = 0;x < 60;x++) {
        for (int y = 0;y < 80;y++) {
            if(pix[x][y] == 0){
                //宽高,rgb三色
               imageData.setPixel(y, x, QColor(0, 0, 0).rgb());

            }else{
                 imageData.setPixel(y, x, QColor(255, 255, 255).rgb());
            }
        }
    }

显示图片:

  QPixmap resImage = QPixmap::fromImage(imageData);
   resImage.scaled(ui->imageLabel->size(), Qt::IgnoreAspectRatio);//图片缩放到和label一样大小,并且改变图片比列
   ui->imageLabel->setScaledContents(true);//label可变属性
   ui->imageLabel->setPixmap(resImage);

4.2 Grayscale16

把二值化的图片转换为 QImage::Format_Grayscale16格式(16位每像素)


int widthCnt = 0, heightCnt = 0;
      for(int i = 0; i < 600;i++){
          for(int j = 7; j >=0;j--){

              if(((tempImgContent[i]>>(j)) & 0x01) == 1){
                  binarydata[heightCnt * 160 + widthCnt*2] =  0xFF;//白(两个4位/一个16进制,8位)
                  binarydata[heightCnt * 160 + widthCnt*2+1] =  0xFF;//白(两个4位/一个16进制,8位)
                  widthCnt++;
                  if(widthCnt == 160){
                      heightCnt++;
                      widthCnt = 0;
                  }
              }else{
                   binarydata[heightCnt * 160 + widthCnt*2] = 0x00;//黑
                   binarydata[heightCnt * 160 + widthCnt*2+1] =  0x00;//黑(两个4位/一个16进制,8位)
                   widthCnt++;
                   if(widthCnt == 160){
                       heightCnt++;
                       widthCnt = 0;
                   }
              }
          }
      }
   QImage imageData(binarydata, 80, 60,  QImage::Format_Grayscale16);

5 实验数据

链接:https://pan.baidu.com/s/1-ZfxiXacSiLCOcxlcBilWw 密码:aqm6

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页