畫素矩陣存為檔案的幾種方式
阿新 • • 發佈:2020-08-03
有時候從某些幀中取得畫素矩陣之後,需要存為檔案或者作為圖片資料使用,些時需要將記憶體轉換為相關的控制代碼或者檔案
相關知識:
不壓縮的格式通常:
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); } } }