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);
            }
        }
    }
  • 相关阅读:
    UVALive 5983 MAGRID DP
    2015暑假训练(UVALive 5983
    poj 1426 Find The Multiple (BFS)
    poj 3126 Prime Path (BFS)
    poj 2251 Dungeon Master 3维bfs(水水)
    poj 3278 catch that cow BFS(基础水)
    poj3083 Children of the Candy Corn BFS&&DFS
    BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)
    洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)
    洛谷P3065 [USACO12DEC]第一!First!(Trie树+拓扑排序)
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/13428199.html
Copyright © 2011-2022 走看看