1. 程式人生 > 實用技巧 >畫素矩陣存為檔案的幾種方式

畫素矩陣存為檔案的幾種方式

有時候從某些幀中取得畫素矩陣之後,需要存為檔案或者作為圖片資料使用,些時需要將記憶體轉換為相關的控制代碼或者檔案

相關知識:

不壓縮的格式通常:

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);
        }
    }
}