zoukankan      html  css  js  c++  java
  • 像素矩阵存为文件的几种方式

    有时候从某些帧中取得像素矩阵之后,需要存为文件或者作为图片数据使用,些时需要将内存转换为相关的句柄或者文件

    相关知识:

    不压缩的格式通常:

    bmp 文件比较大,常作为windows壁纸

    png 从bmp进行了进行了压缩,可还原,当前阶段比较合适的文件格式

    jpg 有损压缩不可还原,早期web图片常用格式

    方式一:完全构造文件(构造文件信息,格式信息,像素信息)

    void  SavePixels(const char* data, int width, int heigh, int size)
    {
        BITMAPFILEHEADER     bmfHdr;
        BITMAPINFOHEADER     bi;
        const int count = 4;//通道数
        bi.biSize = sizeof(BITMAPINFOHEADER);
        bi.biWidth = width;        //1920;
        bi.biHeight = heigh;    //1200;
        bi.biPlanes = 1;
        bi.biBitCount = count * 8;
        bi.biCompression = BI_RGB;// BI_JPEG;//BI_RGB;
        bi.biSizeImage = 0;// size;// 0;
        bi.biXPelsPerMeter = 0;
        bi.biYPelsPerMeter = 0;
        bi.biClrImportant = 0;
        bi.biClrUsed = 0;
    
        auto biBitCount = count * 8;
    
        auto dwBmBitsSize = ((width * biBitCount + biBitCount - 1) / biBitCount) * count * heigh;
    
        auto dwPaletteSize = 1;
    
        auto dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize * dwBmBitsSize;
    
        bmfHdr.bfType = 0x4D42;     //     "BM"              
        bmfHdr.bfSize = dwDIBSize;
        bmfHdr.bfReserved1 = 0;
        bmfHdr.bfReserved2 = 0;
        bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) * dwPaletteSize;
    
        //创建位图文件  
        auto fh = CreateFile(IMGE_PATH_BMP, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    
        if (fh == INVALID_HANDLE_VALUE)
            return;
    
        DWORD dwWritten = 0;
    
        //     写入位图文件头              
        WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
        //     写入位图文件其余内容              
        WriteFile(fh, (LPSTR)&bi, sizeof(bi), &dwWritten, NULL);
    
        WriteFile(fh, (LPSTR)data /*&data[0]*/, dwBmBitsSize, &dwWritten, NULL);
    
        CloseHandle(fh);
    }

    方式二:gdiplus方式保存,构造图片格式,较为省事

    void CImgeSave::savepng(const char* data, int bits, int width, int heigh)
    {
        void* pBuf = (void*)data;
    
        //像素转换为句柄
        {
            // 构建位图头
            BITMAPINFOHEADER bmpInfoHeader;
            memset(&bmpInfoHeader, 0, sizeof(BITMAPINFOHEADER));
            bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
            bmpInfoHeader.biWidth = width;
            bmpInfoHeader.biHeight = heigh;
            bmpInfoHeader.biPlanes = 1;         // MSDN:This value must be set to 1
            bmpInfoHeader.biBitCount = bits * 8;
            bmpInfoHeader.biCompression = BI_RGB;
    
            BITMAPINFO BitmapInfo;
            ZeroMemory(&BitmapInfo, sizeof(BITMAPINFO));
            CopyMemory(&BitmapInfo.bmiHeader, &bmpInfoHeader, sizeof(BITMAPINFOHEADER));
    
            HBITMAP hBitmap = ::CreateDIBitmap(::GetDC(NULL), &bmpInfoHeader, CBM_INIT, pBuf, &BitmapInfo, DIB_RGB_COLORS);
    
            // 保存图像,查看验证
            CImage  image;
            image.Attach(hBitmap);
            image.Save(TEXT("c:\2013_05_09.jpg"));
    
            if (hBitmap)
            {
                HDC   hdc = GetDC(m_view.m_hWnd);;
                HDC hdcBits;
                BITMAP bm;
                hdcBits = CreateCompatibleDC(hdc);
                GetObject(hBitmap, sizeof(BITMAP), &bm);
                SelectObject(hdcBits, hBitmap);
                BitBlt(hdc, 20, 10, bm.bmWidth, bm.bmHeight, hdcBits, 0, 0, SRCCOPY);
                //BitBlt(hdc, 20, 10, bm.bmWidth, bm.bmHeight, hdcBits, 0, 0, SRCCOPY);
                DeleteDC(hdcBits);
                DeleteObject(hBitmap);
            }
        }
    }
  • 相关阅读:
    python解析网页中js动态添加的内容
    pycharm索引index时间很长的原因
    github/gitlab ssh-keys全局唯一
    使用gc、objgraph干掉python内存泄露与循环引用!
    ImportError: No module named _curses;Color support is disabled, python-curses is not installed.解决办法
    jinjia2模板学习
    flask可以通过缓存模板或者页面达到性能提升
    python的websocket实现Tornado
    flask的debug模式下,网页输入pin码进行调试
    Git 环境安装
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/13428199.html
Copyright © 2011-2022 走看看