• VC++ Char * 保存成bmp和JPEG


    void CXBlobMTooldlg::SaveJpgTest()
    {
     int width = 999;
     int height = 1000;
     int band = 1;
     char * pImageData = Vision_GetHwnd(0, 0, 0, width, height);
     int stride = (width + 3) / 4 * 4;
     int rowSize = width * band;
     int strideSize = stride * band;
     char * pConvertData = new char[stride * height * band];
     char * pCopyData = pConvertData;
     pImageData += ((height - 1) * rowSize);
     for (int row = 0; row < height; row++)
     {
      memcpy(pCopyData, pImageData, rowSize);
      pCopyData += strideSize;
      pImageData -= rowSize;
     }
     
     BITMAPINFO * bmInfo = (BITMAPINFO*)malloc(sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD));
     bmInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
     bmInfo->bmiHeader.biWidth = width;
     bmInfo->bmiHeader.biHeight = height;
     bmInfo->bmiHeader.biPlanes = 1;
     //bmInfo->bmiHeader.biBitCount = 8;//8位灰阶数据
     bmInfo->bmiHeader.biBitCount = band * 8;
     bmInfo->bmiHeader.biCompression = 0;//BI_RGB
     bmInfo->bmiHeader.biClrUsed = 0;//或256
     bmInfo->bmiHeader.biSizeImage = 0;
     bmInfo->bmiHeader.biXPelsPerMeter = 0;
     bmInfo->bmiHeader.biYPelsPerMeter = 0;
     bmInfo->bmiHeader.biClrImportant = 0;
     BITMAPINFOHEADER &bmInfohdr = (BITMAPINFOHEADER)bmInfo->bmiHeader;
     for (int i = 0; i<256; i++)
     {
      bmInfo->bmiColors[i].rgbRed = i;
      bmInfo->bmiColors[i].rgbGreen = i;
      bmInfo->bmiColors[i].rgbBlue = i;
     }
     HDC hDC = ::GetDC(0);
     HBITMAP hBmp = CreateDIBitmap(hDC,
      &bmInfohdr,
      CBM_INIT,
      pConvertData,
      bmInfo,
      DIB_RGB_COLORS);
     CImage   mmage;
     mmage.Attach(hBmp);
     int retval = mmage.Save("d:\123.jpg", Gdiplus::ImageFormatJPEG);
     delete[] pConvertData;
    }

    void  CXBlobMTooldlg::SaveBmp(const char *fileName, unsigned char *pImgData, int imgLength, int iWidth, int iHeight)
    {
     BITMAPFILEHEADER targetfileheader;
     BITMAPINFOHEADER targetinfoheader;
     memset(&targetfileheader, 0, sizeof(BITMAPFILEHEADER));
     memset(&targetinfoheader, 0, sizeof(BITMAPINFOHEADER));

     //构造灰度图的文件头
     targetfileheader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256;
     targetfileheader.bfSize = 192 * 192 + sizeof(RGBQUAD) * 256 + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
     targetfileheader.bfReserved1 = 0;
     targetfileheader.bfReserved2 = 0;
     targetfileheader.bfType = 0x4d42;

     //构造灰度图的信息头
     targetinfoheader.biBitCount = 8;
     targetinfoheader.biSize = sizeof(BITMAPINFOHEADER);
     targetinfoheader.biHeight = iHeight;
     targetinfoheader.biWidth = iWidth;
     targetinfoheader.biPlanes = 1;
     targetinfoheader.biCompression = BI_RGB;
     targetinfoheader.biSizeImage = 0;
     targetinfoheader.biXPelsPerMeter = 0;
     targetinfoheader.biYPelsPerMeter = 0;
     targetinfoheader.biClrImportant = 0;
     targetinfoheader.biClrUsed = 0;

     //构造灰度图的调色版
     RGBQUAD rgbquad[256];
     int i;
     for (i = 0; i<256; i++)
     {
      rgbquad[i].rgbBlue = i;
      rgbquad[i].rgbGreen = i;
      rgbquad[i].rgbRed = i;
      rgbquad[i].rgbReserved = 0;
     }
     
     BYTE* ptargetData;
     ptargetData = new BYTE[iWidth*iHeight];
     //由于BMP图像对于行是倒置的,即图像显示的第一行是最后一行数据,所以要倒置,这里的pcutface已经////是灰度图像了
     for (long i = iHeight -1; i >= 0; i--)
     {
      for (long j = 0; j<iWidth; j++)
      {
       ptargetData[i * iWidth + j] = pImgData[(iHeight-1 - i) * iWidth + j];
      }
     }
     CFile file;
     if (file.Open(fileName, CFile::modeCreate | CFile::modeWrite))
     {
      file.Write(&targetfileheader, sizeof(BITMAPFILEHEADER));
      file.Write(&targetinfoheader, sizeof(BITMAPINFOHEADER));
      file.Write(&rgbquad, sizeof(RGBQUAD) * 256);
      file.Write(ptargetData, iWidth*iHeight);   //这里targetbuf的大小为192x192
      file.Close();
      delete ptargetData;
      ptargetData = NULL;
     }
    }

  • 相关阅读:
    二维坐标离散化
    unique()函数使用
    如果你的unordered_map头文件报错请看这里
    string删除与查找erase,find
    2017 ACM-ICPC, Universidad Nacional de Colombia Programming Contest K
    2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 2) P-Fear Factoring 区间内数的所有因数的和(除法分块)
    .NETCore使用EntityFrameworkCore连接数据库生成实体
    sql server 触发器开发
    Windows 配置定时任务 和任务无法执行原因分析
    sql 的存储过程和事务
  • 原文地址:https://www.cnblogs.com/profession/p/13909394.html
Copyright © 2020-2023  润新知