VC6.0把读取的图像另存为bmp图片,怎么弄?

eeds136 2014-04-09 05:23:37
VC打开了一个图像,并获得了图像文件路径,怎么把这个图像保存为bmp图片?求指导!
...全文
223 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
eeds136 2014-04-14
  • 打赏
  • 举报
回复
我主要实现图像可以让MATLAB调用,请问怎么弄?这是具体:http://bbs.csdn.net/topics/390748479
buyong 2014-04-11
  • 打赏
  • 举报
回复
vc、msdn带的demo里就有
赵4老师 2014-04-11
  • 打赏
  • 举报
回复
仅供参考
#pragma comment(lib,"gdi32")
#include <windows.h>
#include <stdio.h>

int main() {
    const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;

    PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);
    pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
    pbmi->bmiHeader.biWidth = uWidth;
    pbmi->bmiHeader.biHeight = uHeight;
    pbmi->bmiHeader.biPlanes = 1;
    pbmi->bmiHeader.biBitCount = 1;
    pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;
    pbmi->bmiColors[0].rgbBlue = 0;
    pbmi->bmiColors[0].rgbGreen = 0;
    pbmi->bmiColors[0].rgbRed = 0;
    pbmi->bmiColors[1].rgbBlue = 255;
    pbmi->bmiColors[1].rgbGreen = 255;
    pbmi->bmiColors[1].rgbRed = 255;

    HDC hDC = CreateCompatibleDC (0);
    void * pvBits;
    HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);
    SelectObject (hDC, hBitmap);
    HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");
//  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");
    SelectObject (hDC, hFont);
    BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);

    char c[4];
    int i, j;
    for (i = 128; i < 256; i++) {
        sprintf (c, "%02X", i);
        TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);
    }
    for (j = 0; j < 256; j++) {
        sprintf (c, "%02X", j);
        TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);
    }
    for (i = 128; i < 256; i++) {
        for (j = 0; j < 256; j++) {
            c[0] = (char) i;
            c[1] = (char) j;
            TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);
        }
    }
    for (i = 0; i < 130; i++) {
        MoveToEx (hDC, 0, i * 17, NULL);
        LineTo (hDC, uWidth, i * 17);
    }
    for (j = 0; j < 258; j++) {
        MoveToEx (hDC, j * 17, 0, NULL);
        LineTo (hDC, j * 17, uHeight);
    }

    BITMAPFILEHEADER bmfh;
    bmfh.bfType = *(PWORD) "BM";
    bmfh.bfReserved1 = 0;
    bmfh.bfReserved2 = 0;
    bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;
    bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;

    HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
    if (hFile != INVALID_HANDLE_VALUE) {
        DWORD dwWritten;
        WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);
        WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);
        WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);

        CloseHandle (hFile);
    }

    DeleteObject (hFont);
    DeleteObject (hBitmap);
    DeleteDC (hDC);
    LocalFree (pbmi);

    return 0;
}
新手上路1234 2014-04-11
  • 打赏
  • 举报
回复
eeds136 2014-04-11
  • 打赏
  • 举报
回复
图片已经显示在了窗口,就是bmp的格式,我想把显示的图像都统一命名,然后Matlab调用
jacky_qiu 2014-04-11
  • 打赏
  • 举报
回复



//保存位图
int   SaveBitmap(HBITMAP   hBitmap,   LPSTR   lpFileName)   
{   
	//lpFileName   为位图文件名   
	HDC           hDC;                     
	//设备描述表   
	int           iBits;               
    //当前显示分辨率下每个像素所占字节数   
	WORD         wBitCount;         
	//位图中每个像素所占字节数   
	//定义调色板大小,   位图中像素字节大小   ,     位图文件大小   ,   写入文件字节数   
	DWORD                       dwPaletteSize=0,dwBmBitsSize,dwDIBSize,   dwWritten;   
	BITMAP                     Bitmap;                   
	//位图属性结构   
	BITMAPFILEHEADER       bmfHdr;                   
	//位图文件头结构   
	BITMAPINFOHEADER       bi;                           
	//位图信息头结构     
	LPBITMAPINFOHEADER   lpbi;                       
	//指向位图信息头结构   
	HANDLE                     fh,   hDib,   hPal;   
	HPALETTE           hOldPal=NULL;   
	//定义文件,分配内存句柄,调色板句柄   
	
	//计算位图文件每个像素所占字节数   
	iBits=24;   
	if   (iBits   <=   1)   
		wBitCount   =   1;   
	else   if   (iBits   <=   4)   
		wBitCount   =   4;   
	else   if   (iBits   <=   8)   
		wBitCount   =   8;   
	else   if   (iBits   <=   32)   
		wBitCount   =   24;   
	//计算调色板大小   
	if   (wBitCount   <=   8)   
		dwPaletteSize=(1<<wBitCount)*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                   =   wBitCount;   
	bi.biCompression             =   BI_RGB;   
	bi.biSizeImage                 =   0;   
	bi.biXPelsPerMeter           =   0;   
	bi.biYPelsPerMeter           =   0;   
	bi.biClrUsed                   =   0;   
	bi.biClrImportant             =   0;   
    
	dwBmBitsSize   =   ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;   
	
	//为位图内容分配内存   
	hDib     =   GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));   
	lpbi   =   (LPBITMAPINFOHEADER)GlobalLock(hDib);   
	*lpbi   =   bi;   
	//   处理调色板         
	hPal   =   GetStockObject(DEFAULT_PALETTE);   
	if   (hPal)   
	{   
		hDC   =   GetDC(NULL);   
		hOldPal=SelectPalette(hDC,(HPALETTE)hPal,FALSE);   
		RealizePalette(hDC);   
	}   
	//   获取该调色板下新的像素值   
	GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize,   (BITMAPINFO   *)lpbi,DIB_RGB_COLORS);   
	//恢复调色板         
	if   (hOldPal)   
	{   
		SelectPalette(hDC,   hOldPal,   TRUE);   
		RealizePalette(hDC);   
		ReleaseDC(NULL,   hDC);   
	}   
	//创建位图文件           
	fh=CreateFile(lpFileName,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL   |   FILE_FLAG_SEQUENTIAL_SCAN,   NULL);   
	if   (fh==INVALID_HANDLE_VALUE)   
		return   FALSE;   
	//   设置位图文件头   
	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;   
	//   写入位图文件头   
	WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);   
	//   写入位图文件其余内容   
	WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,     
        &dwWritten,   NULL);   
	//清除         
	GlobalUnlock(hDib);   
	GlobalFree(hDib);   
	CloseHandle(fh);   
	return   TRUE;   
}   
幻夢之葉 2014-04-11
  • 打赏
  • 举报
回复
是bmp的就直接拷贝 不是就按照bmp的文件格式进行存储! 百度百科有 BMP 有文件存储格式
tab_duanjunying 2014-04-11
  • 打赏
  • 举报
回复
如果显示图像的格式就是BMP,而且你已经知道显示图像的文件路径,那你只要拷贝文件和给文件重命名就可以了,为什么还要从显示窗口中抓取然后再存储?
yiyefangzhou24 2014-04-10
  • 打赏
  • 举报
回复
BOOL WINAPI WriteFile( _In_ HANDLE hFile, _In_ LPCVOID lpBuffer, _In_ DWORD nNumberOfBytesToWrite, _Out_opt_ LPDWORD lpNumberOfBytesWritten, _Inout_opt_ LPOVERLAPPED lpOverlapped ); BOOL WINAPI ReadFile( _In_ HANDLE hFile, _Out_ LPVOID lpBuffer, _In_ DWORD nNumberOfBytesToRead, _Out_opt_ LPDWORD lpNumberOfBytesRead, _Inout_opt_ LPOVERLAPPED lpOverlapped );
tab_duanjunying 2014-04-10
  • 打赏
  • 举报
回复
打开了一个图像是什么意思?是已经显示在窗口中了吗?获得文件路径没用,跟你的问题不相干,除非文件就是BMP的,只要图像显示于窗体了,就可以转BMP了

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧