VC++ 保存位圖
看樣子你已經(jīng)獲得了位圖的句柄了,現(xiàn)在我只需要給你一個(gè)通過(guò)句柄來(lái)保存圖像的函數(shù)了。
filename是保存路徑,nColor不用理會(huì),hbitmap就是你的位圖句柄。
更多詳解請(qǐng)登錄www.liublog.com.cn
BOOL CDib::SaveNewImage(HBITMAP hbitmap, LPSTR filename, int nColor)
{
BITMAP Bitmap;
HDC hDC;
DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;
BITMAPFILEHEADER bmfHdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh, hDib, hPal,hOldPal=NULL;
if (nColor<= 8)
dwPaletteSize = (1<<nColor) *sizeof(RGBQUAD);
GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = nColor;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth * nColor+31)/32*4)*Bitmap.bmHeight;
//為位圖分配內(nèi)存
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
//設(shè)置調(diào)色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 獲取該調(diào)色板下新的像素值
GetDIBits(hDC, hbitmap, 0, Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
(BITMAPINFO *)lpbi, DIB_RGB_COLORS);
if (hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL,hDC);
}
fh = CreateFile(filename, GENERIC_WRITE,
0,//not be shared
NULL, //cannot be inherited
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if (fh == INVALID_HANDLE_VALUE)
return FALSE;
//設(shè)置位圖文件頭
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize;
//write file header
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
//write bmp data
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
DeleteObject(hbitmap);
return TRUE;
}
CImage img;
img.Attach( BMP);
img.Save(_T("filename.bmp"));
img.Detach();
stone_dongdong大哥,VC6.0里好象沒(méi)這個(gè)類
管壟17758412965: VC++ 向access中存儲(chǔ)圖片? -
鄂爾多斯市短中: ______ Access的對(duì)象“表”中完全可以存放圖片!其字段屬性就應(yīng)設(shè)置為“OLE對(duì)象”,這樣就可以將 GIF、JPEG 和其他常見類型的圖像文件添加到表中.因?yàn)?OLE 對(duì)象字段只支持“Windows 位圖”(.bmp) 文件和“與設(shè)備無(wú)關(guān)的位圖”(.dib) 文件.如果您想將其他類型的圖形文件存儲(chǔ)到 OLE 對(duì)象字段中并讓 Access 正確呈現(xiàn)它們,就必須安裝其他軟件,而該軟件必須提供顯示其他圖像類型所需的組件(被稱為 OLE 服務(wù)器).我也沒(méi)在數(shù)據(jù)庫(kù)中存過(guò)圖片,上邊是在其他地方看到的,你可以嘗試百度一下上邊的關(guān)鍵詞,看看有沒(méi)有具體的過(guò)程或者例子,能幫你的就這些了.
管壟17758412965: 如何在vc中全屏顯示對(duì)話框上的位圖 -
鄂爾多斯市短中: ______ 其實(shí)圖片可以用JPG什么的,但是相對(duì)需要用到一個(gè)IPICTURE的接口,亂七八糟的還..... 當(dāng)然最好還是用位圖...... 有個(gè)拉伸圖片的函數(shù),API和CDC好象都有.//得到分辨率 int full_x = GetSystemMetrics(SM_CXSCREEN); int full_y = GetSystemMetrics(SM_CYSCREEN);//::SetWindowPos(this->m_hWnd,HWND_TOPMOST,0,0,full_x,full_y,0 ); 大概這么個(gè)意思
管壟17758412965: 用VC++ 怎樣把圖像輸出保存成jepg或bmp圖像 -
鄂爾多斯市短中: ______ bmp是可以的,先轉(zhuǎn)成與設(shè)備無(wú)關(guān)的dib位圖再保存,代碼就不貼了,google一大把.如果是jpeg格式的話,一種是可以用開源的jpeg庫(kù).還有一種方法是用gdi+實(shí)現(xiàn),不過(guò)gdi+只在vc.net支持.
管壟17758412965: VC++ 怎么插入JPG圖片 非BMP位圖
鄂爾多斯市短中: ______ VC中圖片插入和位圖操作 一.在程序中插入JPG圖片 Graphics graphics(hDC); WCHAR strBKG[256]; Image* m_imgBK; CString strBK=theApp.m_strStartPath + "\\topoBK.JPG";//1 BSTR bstrBK = strBK.AllocSysString();//2 wcscpy(strBKG, ...
管壟17758412965: 現(xiàn)已獲得各個(gè)像素點(diǎn)的坐標(biāo)和灰度值,如何用VC++繪制位圖 -
鄂爾多斯市短中: ______ 嗯 ~~是這樣的,.1:你知道每個(gè)像素的坐標(biāo)和灰度,那就知道圖像的大小,定義一個(gè)固定的二維數(shù)組,把所有像素存入其中.color ColorBuffer[WIDTH][HEIGHT] = {0}; ColorBuffer[i][j].b = ColorBuffer[i][j].g = ColorBuffer[i][j].r = colorzhi1//當(dāng)前像素...
管壟17758412965: C++中怎么把位圖輸出到窗口 -
鄂爾多斯市短中: ______ #include int PaintBitmap (HWND hwnd ,HBITMAP hBitmap) { RECT rect ; BITMAP bitmap ; HDC hdcSrc = GetDC (hwnd) ; HDC hdcBmp = CreateCompatibleDC (hdcSrc) ; SelectObiect (hdcBmp ,hBitmap) ; GetClientRect (hwnd ,&rect) ; GetObject ...
管壟17758412965: 用VC++如何獲取屏幕圖像,且顯示出來(lái) -
鄂爾多斯市短中: ______ HBITMAP holdbitmap,hbitmap; HDC hdc,hscreendc,hmemdc; hdc=GetWindowDC(hwnd);//獲得整個(gè)hwnd指向的窗口的DC GetWindowRect(hwnd,&rect);//獲得窗口矩形 hscreendc=CreateDC("DISPLAY",NULL,NULL,NULL);//獲得整個(gè)屏幕...
管壟17758412965: 怎么用vc++6.0創(chuàng)建256色的位圖 -
鄂爾多斯市短中: ______ VC6是支持將256色的圖片編譯到你的項(xiàng)目中的 但是VC6本身并不支持256色圖片的編輯 所以你最好是將你的圖片用其它工具(如小畫筆)編輯好之后保存到你的項(xiàng)目目錄下,然后將資源導(dǎo)入就可以了
管壟17758412965: 【高分求救】VC++下如何載入一張位圖并獲取該位圖的像素值 -
鄂爾多斯市短中: ______ HBITMAP hBmp = (HBITMAP)LoadImage( NULL , "z:\\bg4.bmp" , IMAGE_BITMAP , 0 , 0 , LR_CREATEDIBSECTION | LR_LOADFROMFILE); if (hBmp != NULL) { BITMAP bmp = {0}; int ret = GetObject( hBmp , sizeof(BITMAP) , &bmp ); if (ret) ...
管壟17758412965: VC++中如何刪除位圖? -
鄂爾多斯市短中: ______ 在資源試圖處選中此位圖,單擊鍵盤上的“Delete刪除”按鈕.這樣你的工程里就沒(méi)有了.為了節(jié)約資源,你再到你的工程文件夾里的res子文件夾,把那個(gè)位圖刪除就OK了
filename是保存路徑,nColor不用理會(huì),hbitmap就是你的位圖句柄。
更多詳解請(qǐng)登錄www.liublog.com.cn
BOOL CDib::SaveNewImage(HBITMAP hbitmap, LPSTR filename, int nColor)
{
BITMAP Bitmap;
HDC hDC;
DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;
BITMAPFILEHEADER bmfHdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh, hDib, hPal,hOldPal=NULL;
if (nColor<= 8)
dwPaletteSize = (1<<nColor) *sizeof(RGBQUAD);
GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = nColor;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth * nColor+31)/32*4)*Bitmap.bmHeight;
//為位圖分配內(nèi)存
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
//設(shè)置調(diào)色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 獲取該調(diào)色板下新的像素值
GetDIBits(hDC, hbitmap, 0, Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
(BITMAPINFO *)lpbi, DIB_RGB_COLORS);
if (hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL,hDC);
}
fh = CreateFile(filename, GENERIC_WRITE,
0,//not be shared
NULL, //cannot be inherited
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if (fh == INVALID_HANDLE_VALUE)
return FALSE;
//設(shè)置位圖文件頭
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize;
//write file header
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
//write bmp data
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
DeleteObject(hbitmap);
return TRUE;
}
CImage img;
img.Attach( BMP);
img.Save(_T("filename.bmp"));
img.Detach();
stone_dongdong大哥,VC6.0里好象沒(méi)這個(gè)類
相關(guān)評(píng)說(shuō):
鄂爾多斯市短中: ______ Access的對(duì)象“表”中完全可以存放圖片!其字段屬性就應(yīng)設(shè)置為“OLE對(duì)象”,這樣就可以將 GIF、JPEG 和其他常見類型的圖像文件添加到表中.因?yàn)?OLE 對(duì)象字段只支持“Windows 位圖”(.bmp) 文件和“與設(shè)備無(wú)關(guān)的位圖”(.dib) 文件.如果您想將其他類型的圖形文件存儲(chǔ)到 OLE 對(duì)象字段中并讓 Access 正確呈現(xiàn)它們,就必須安裝其他軟件,而該軟件必須提供顯示其他圖像類型所需的組件(被稱為 OLE 服務(wù)器).我也沒(méi)在數(shù)據(jù)庫(kù)中存過(guò)圖片,上邊是在其他地方看到的,你可以嘗試百度一下上邊的關(guān)鍵詞,看看有沒(méi)有具體的過(guò)程或者例子,能幫你的就這些了.
鄂爾多斯市短中: ______ 其實(shí)圖片可以用JPG什么的,但是相對(duì)需要用到一個(gè)IPICTURE的接口,亂七八糟的還..... 當(dāng)然最好還是用位圖...... 有個(gè)拉伸圖片的函數(shù),API和CDC好象都有.//得到分辨率 int full_x = GetSystemMetrics(SM_CXSCREEN); int full_y = GetSystemMetrics(SM_CYSCREEN);//::SetWindowPos(this->m_hWnd,HWND_TOPMOST,0,0,full_x,full_y,0 ); 大概這么個(gè)意思
鄂爾多斯市短中: ______ bmp是可以的,先轉(zhuǎn)成與設(shè)備無(wú)關(guān)的dib位圖再保存,代碼就不貼了,google一大把.如果是jpeg格式的話,一種是可以用開源的jpeg庫(kù).還有一種方法是用gdi+實(shí)現(xiàn),不過(guò)gdi+只在vc.net支持.
鄂爾多斯市短中: ______ VC中圖片插入和位圖操作 一.在程序中插入JPG圖片 Graphics graphics(hDC); WCHAR strBKG[256]; Image* m_imgBK; CString strBK=theApp.m_strStartPath + "\\topoBK.JPG";//1 BSTR bstrBK = strBK.AllocSysString();//2 wcscpy(strBKG, ...
鄂爾多斯市短中: ______ 嗯 ~~是這樣的,.1:你知道每個(gè)像素的坐標(biāo)和灰度,那就知道圖像的大小,定義一個(gè)固定的二維數(shù)組,把所有像素存入其中.color ColorBuffer[WIDTH][HEIGHT] = {0}; ColorBuffer[i][j].b = ColorBuffer[i][j].g = ColorBuffer[i][j].r = colorzhi1//當(dāng)前像素...
鄂爾多斯市短中: ______ #include int PaintBitmap (HWND hwnd ,HBITMAP hBitmap) { RECT rect ; BITMAP bitmap ; HDC hdcSrc = GetDC (hwnd) ; HDC hdcBmp = CreateCompatibleDC (hdcSrc) ; SelectObiect (hdcBmp ,hBitmap) ; GetClientRect (hwnd ,&rect) ; GetObject ...
鄂爾多斯市短中: ______ HBITMAP holdbitmap,hbitmap; HDC hdc,hscreendc,hmemdc; hdc=GetWindowDC(hwnd);//獲得整個(gè)hwnd指向的窗口的DC GetWindowRect(hwnd,&rect);//獲得窗口矩形 hscreendc=CreateDC("DISPLAY",NULL,NULL,NULL);//獲得整個(gè)屏幕...
鄂爾多斯市短中: ______ VC6是支持將256色的圖片編譯到你的項(xiàng)目中的 但是VC6本身并不支持256色圖片的編輯 所以你最好是將你的圖片用其它工具(如小畫筆)編輯好之后保存到你的項(xiàng)目目錄下,然后將資源導(dǎo)入就可以了
鄂爾多斯市短中: ______ HBITMAP hBmp = (HBITMAP)LoadImage( NULL , "z:\\bg4.bmp" , IMAGE_BITMAP , 0 , 0 , LR_CREATEDIBSECTION | LR_LOADFROMFILE); if (hBmp != NULL) { BITMAP bmp = {0}; int ret = GetObject( hBmp , sizeof(BITMAP) , &bmp ); if (ret) ...
鄂爾多斯市短中: ______ 在資源試圖處選中此位圖,單擊鍵盤上的“Delete刪除”按鈕.這樣你的工程里就沒(méi)有了.為了節(jié)約資源,你再到你的工程文件夾里的res子文件夾,把那個(gè)位圖刪除就OK了