截屏opencv保存bmp图像像只有左上角一点

查看:1871|回复:2
复制内容到剪贴板代码:#include &stdafx.h&
#include &stdlib.h&
#include &Windows.h&
#include &iostream&
int _tmain(int argc, _TCHAR* argv[])
& & & & HDC hScrDc = CreateDC(L&DISPLAY&,NULL,NULL,NULL);& & & & //屏幕
& & & & //获取屏幕像素
& & & & int xScrn=GetDeviceCaps(hScrDc,HORZRES);
& & & & int yScrn=GetDeviceCaps(hScrDc,VERTRES);
& & & & //创建一个与指定设备兼容的&&内存设备
& & & & HDC hMemDc = CreateCompatibleDC(hScrDc);//(屏幕)
& & & & //创建一个兼容指定设备环境 的位图
& & & & HBITMAP& & & & hbitmap = CreateCompatibleBitmap(hScrDc,400,200);
& & & & //载入一个对象到指定的设备环境内& & (将屏幕位图载入内存设备环境)
& & & & HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDc,hbitmap);
& & & & //选取指定矩形
& & & & BOOL isok = BitBlt(hMemDc,0,0,400,200,hScrDc,0,0,SRCCOPY);& & & &
& & & & //获取矩形数据
& & & & hbitmap=(HBITMAP)SelectObject(hMemDc,hOldBmp);
& & & & //定义调色板大小, 位图中像素字节大小 ,&&位图文件大小 , 写入文件字节数
& & & & DWORD& && && &&&dwPaletteSize=0;
& & & & BITMAP& & & & & & & & & & & & & & & && &&&//创建位图结构
& & & & PBITMAPINFO& & & & & & & & & & & &
& & & & WORD& & & & & & & & & & & & cClrB& & & &&&//当前显示分辨率下每个像素所占字节数
& & & & //-----------检索位图颜色格式、宽度和高度。-----------------ss
& & & & if (!GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bmp))
& & & & & & & & cout&&&error0&&&
& & & &&&// Convert the color format to a count of bits.
& & & & cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
& & & & if (cClrBits &= 1)
& & & & & & & & cClrBits = 1;
& & & & else if (cClrBits &= 4)
& & & & & & & & cClrBits = 4;
& & & & else if (cClrBits &= 8)
& & & & & & & & cClrBits = 8;
& & & & else if (cClrBits &= 24)
& & & & & & & & cClrBits = 24;
& & & & else
& & & & & & & & cClrBits = 32;
& & & & //计算调色板大小
& & & & // 为BITMAPINFO结构分配内存。(这个结构包含一个BITMAPINFOHEADER结构和RGBQUAD结构的数组数据。)
& & & & if (cClrBits & 24)
& & & & & & & & pbmi = (PBITMAPINFO) LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1&& cClrBits));
& & & & // There is no RGBQUAD array for these formats: 24-bit-per-pixel or 32-bit-per-pixel
& & & & else
& & & & & & & & pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER));
& & & & //初始化BITMAPINFO结构的字段
& & & & pbmi-&bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
& & & & pbmi-&bmiHeader.biWidth = bmp.bmW
& & & & pbmi-&bmiHeader.biHeight = bmp.bmH
& & & & pbmi-&bmiHeader.biPlanes = bmp.bmP
& & & & pbmi-&bmiHeader.biBitCount = bmp.bmBitsP
& & & & if (cClrBits & 24)
& & & & & & & & pbmi-&bmiHeader.biClrUsed = (1&&cClrBits);
& & & &&&//如果位图未压缩,设置BI_RGB标志
& & & & pbmi-&bmiHeader.biCompression = BI_RGB;
& & & & //计算颜色索引数组的字节数,存储到biSizeImage字段。宽度必须是双字对齐的除非位图是RLE压缩。
& & & & pbmi-&bmiHeader.biSizeImage = ((pbmi-&bmiHeader.biWidth * cClrBits +31) & ~31) /8 * pbmi-&bmiHeader.biH
& & & & //设置 biClrImportant 为 0,表示改设备的所有颜色都很重要
& & & & pbmi-&bmiHeader.biClrImportant = 0;
& & & & //////////////////////////////////////////////////////////////////////////
& & & & ////////////////////////写文件////////////////////////////////////////////
& & & & HANDLE& && && && && &&&// file handle&&
& & & & BITMAPFILEHEADER& && & // bitmap file-header&&
& & & & PBITMAPINFOHEADER& &&&// bitmap info-header&&
& & & & LPBYTE lpB& && && && &&&// memory pointer&&
& & & & DWORD dwT& && && && &&&// total count of bytes&&
& & & & DWORD& && && && && && & // incremental count of bytes&&
& & & & BYTE *& && && && && && & // byte pointer&&
& & & & pbih = (PBITMAPINFOHEADER)
& & & & //分配一个固定大小的内存,并返回该指针
& & & & lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih-&biSizeImage);
& & & & if (!lpBits) cout&&&error1&&&
& & & & //从DIB检索出颜色表(RGBQUAD array)和字节(array of palette indices).&&
& & & & if (!GetDIBits(hScrDc, hbitmap, 0, (WORD) pbih-&biHeight, lpBits, pbmi, DIB_RGB_COLORS))
& & & & & & & & cout&&&error2&&&
& & & & //初始化 bitmap file-header
& & & & hdr.bfType = 0x4d42;& && &&&// 0x42 = &B& 0x4d = &M&&&
& & & & // 计算整个图像文件的大小.&&
& & & & hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbih-&biSize + pbih-&biClrUsed * sizeof(RGBQUAD) + pbih-&biSizeImage);
& & & & hdr.bfReserved1 = 0;
& & & & hdr.bfReserved2 = 0;
& & & & //计算颜色索引偏移地址
& & & & hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbih-&biSize + pbih-&biClrUsed * sizeof (RGBQUAD);
& & & & //拷贝到buff
& & & & long bmpTotalSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + pbih-&biClrUsed * sizeof (RGBQUAD)+pbih-&biSizeI
& & & & cout&&bmpTotalSize&&
& & & & unsigned char* buff = new unsigned char[bmpTotalSize+1];
& & & & //拷贝 BITMAPFILEHEADER
& & & & memcpy(buff,&hdr,sizeof(BITMAPFILEHEADER));
& & & & //拷贝BITMAPINFOHEADER and RGBQUAD array
& & & & memcpy(buff+sizeof(BITMAPFILEHEADER)+1,&pbih,sizeof(BITMAPINFOHEADER) + pbih-&biClrUsed * sizeof (RGBQUAD));
& & & &&&//拷贝 array of color indices
& & & & long start = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + pbih-&biClrUsed * sizeof (RGBQUAD)+1;
& & & & long size =& &pbih-&biSizeI
& & & & cout&&&start:&&&start&&&\tsize:&&&size&&&\t\tTTT:&&&sizeof(lpBits)&&
& & & & //memcpy(buff+start,&lpBits,size);
& & & & //Create the .BMP file.&&
& & & & DWORD dwT//每次写入文件的字节数
& & & & hf = CreateFile(L&c:/1.bmp&, GENERIC_READ | GENERIC_WRITE, & & & & (DWORD) 0, & & & & NULL, & & & & CREATE_ALWAYS, & & & & FILE_ATTRIBUTE_NORMAL, & & & & (HANDLE) NULL);
& & & & if (hf == INVALID_HANDLE_VALUE)
& & & & & & & & cout&&&error3&&&
& & & & // Copy the BITMAPFILEHEADER into the .BMP file.&&
& & & & if (!WriteFile(hf,&buff, sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + pbih-&biClrUsed * sizeof (RGBQUAD), (LPDWORD) &dwTmp,&&NULL))
& & & & & & & & cout&&&error4&&&
& & & & cout&&&buff写入:&&&dwTmp&&
& & & & // Copy the array of color indices into the .BMP file.&&
& & & & dwTotal = cb = pbih-&biSizeI
& & & & hp = lpB
& & & & if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))
& & & & & & & & cout&&&error6&&&
& & & & cout&&&颜色索引数组写入:&&&dwTotal&&
& & & & //Create the .BMP file.&&
& & & & DWORD dwT//每次写入文件的字节数
& & & & hf = CreateFile(L&c:/1.bmp&, GENERIC_READ | GENERIC_WRITE, & & & & (DWORD) 0, & & & & NULL, & & & & CREATE_ALWAYS, & & & & FILE_ATTRIBUTE_NORMAL, & & & & (HANDLE) NULL);
& & & & if (hf == INVALID_HANDLE_VALUE)
& & & & & & & & cout&&&error3&&&
& & & & // Copy the BITMAPFILEHEADER into the .BMP file.&&
& & & & if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp,&&NULL))
& & & & cout&&&error4&&&
& & & & cout&&&BITMAPFILEHEADER写入:&&&dwTmp&&
& & & & // Copy the BITMAPINFOHEADER and RGBQUAD array into the file.&&
& & & & if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER) + pbih-&biClrUsed * sizeof (RGBQUAD), (LPDWORD) &dwTmp, ( NULL)))
& & & & & & & & cout&&&error5&&&
& & & & cout&&&PBITMAPINFOHEADER写入:&&&dwTmp&&
& & & & // Copy the array of color indices into the .BMP file.&&
& & & & dwTotal = cb = pbih-&biSizeI
& & & & hp = lpB
& & & & if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))
& & & & & & & & cout&&&error6&&&
& & & & cout&&&颜色索引数组写入:&&&dwTotal&&
& & & & // Close the .BMP file.&&
& & & & if (!CloseHandle(hf)) cout&&&error7&&&
& & & & // Free memory.&&
& & & & GlobalFree((HGLOBAL)lpBits);
& & & & system(&pause&);
& & & & /*DeleteObject(bitmap);*/& &// 外部使用完bitmap后需要释放该对象
& & & & return 0;
版规,发帖可获2无忧币
//拷贝到buff
& && &&&long bmpTotalSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + pbih-&biClrUsed * sizeof (RGBQUAD)+pbih-&biSizeI
& && &&&cout&&bmpTotalSize&&
& && &&&unsigned char* buff = new unsigned char[bmpTotalSize+1];
& && &&&//拷贝 BITMAPFILEHEADER
& && &&&memcpy(buff,&hdr,sizeof(BITMAPFILEHEADER));
& && &&&//拷贝BITMAPINFOHEADER and RGBQUAD array
& && &&&memcpy(buff+sizeof(BITMAPFILEHEADER)+1,&pbih,sizeof(BITMAPINFOHEADER) + pbih-&biClrUsed * sizeof (RGBQUAD));
& && && &//拷贝 array of color indices
& && &&&long start = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + pbih-&biClrUsed * sizeof (RGBQUAD)+1;
& && &&&long size =& &pbih-&biSizeI
& && &&&cout&&&start:&&&start&&&\tsize:&&&size&&&\t\tTTT:&&&sizeof(lpBits)&&
& && &&&//memcpy(buff+start,&lpBits,size);
问题是在上面。我想建立一个char数组,然后将bmp文件的数据全部拷贝到这个char数组里面,但是我通过
//拷贝 BITMAPFILEHEADER
& && &&&memcpy(buff,&hdr,sizeof(BITMAPFILEHEADER));
& && &&&//拷贝BITMAPINFOHEADER and RGBQUAD array
& && &&&memcpy(buff+sizeof(BITMAPFILEHEADER)+1,&pbih,sizeof(BITMAPINFOHEADER) + pbih-&biClrUsed * sizeof (RGBQUAD));
这两步来代替
if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp,&&NULL))
cout&&&error4&&&
cout&&&BITMAPFILEHEADER写入:&&&dwTmp&&
// Copy the BITMAPINFOHEADER and RGBQUAD array into the file.&&
if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER) + pbih-&biClrUsed * sizeof (RGBQUAD), (LPDWORD) &dwTmp, ( NULL)))
cout&&&error5&&&
cout&&&PBITMAPINFOHEADER写入:&&&dwTmp&&
这两步写图片的时候,写出的图片是损坏了的。
请问:应该怎么把这个bmp图片转成一个数组啊?
版规,回帖可获2无忧币
为什么要转换成数组再写文件呢
直接写不可以么中文(简体)
中文(繁體)
中文(台灣)
中文(新加坡)
中文(香港)
按下键盘上的Print Screen 键。 这个按钮通常标记为prt sc, prt scrn,或prt scr。
如果只是截取活动窗口,而非全屏,同时按下Alt和Print Screen键。
有些键盘和移动电脑没有这个键。但是通常通过另一套键盘指令也可以实现相同功能。例如,Fn+Insert。查看电脑使用说明书或键盘指令手册以获得更准确信息。
打开图片编辑软件。Windows默认的是“画图”。点击“开始”,“附件”,点击“画图”。
如果你用的是Windows 8,按下键盘上的Window图标,返回“开始”屏幕。输入“画图”,找出该应用。一旦出现,点击标题打开它。
从剪贴板粘贴截图内容。点击左上角菜单栏的“粘贴”,直接粘贴截图至当前画图文件。该选项在“主页”选项卡下。
还可以通过点击“编辑”,“粘贴”完成粘贴。
更快捷的做法是按下Ctrl+v完成粘贴。
从“文件”菜单中选择“保存为”存储图片。 如果点击挨着“保存为”的箭头,你还可以指定保存格式。
可选格式包括Png, Jpeg, Bmp和Gif。要另存为其他格式,点击 “其他格式”。
键入图片名称。在文件名下给图片创建一个好记的名字。
确保图片存在容易找到的路径,比如“图片”文件夹。
或者你还可以在“另存为”对话框的“存储格式”菜单下选择文件类型。
6点击“保存”按钮。在“另存为”对话框中点击该按钮,保存图片,完成整个过程。
打开Snipping Tool。如果你用的是Windows 7 或Windows Vista,选中“开始”,“所有程序”,“附件”,“Snipping Tool”。
该功能只存于Windows 7, Windows Vista和Windows 8。
要在Windows 8打开,点击键盘上的“Window”键,返回“开始”屏幕。输入Snipping Tool,自动搜索该应用。一出结果,点击打开。
2点击“新建”旁边的向下箭头。点击“新建”,自动创建一个矩形截图区域,但通过点击箭头,可以调整截图形状。
选择截图类型。可选选项包括自由截图,窗口截图,全屏截图。
自由截图允许你自由勾勒截图形状。
矩形截图是默认选项,你可以在要截图的区域拖拽矩形。
Window Snip会截取当前活动窗口。
全屏截图会截取整个屏幕。
选中待截取区域。如果你选择的是自由截图或矩形截图,还需要在截图区域拖拽截图轮廓。
选中后包含图片的新窗口会自动弹出。
5新窗口中,从“文件”菜单中选中“另存为”。这时会弹出“另存为”对话框,保存截图。
输入文件名,选择类型。键入文件名,更改文件类型。
可选文件类型包括png, gif, jpeg和单文件html。
确保存至你的“图片”文件夹,或其他最近访问的路径。
7点击“保存”按钮,存储截图,完成整个过程。
按下键盘上的Cmd+Shift+3。这将截取整个屏幕。
Mac OS X自动在桌面保存其为Png文件。
按下键盘上的Cmd+Shift+4。这时光标变为十字。围绕你要截取的部分拖拽矩形, 单击,拖拽十字。
Mac OS X自动保存其为截图。同样保存至桌面为Png文件。
在键盘上按下Cmd+Shift+4 ,紧接着按下空格键。十字会变为摄像标志。点击你想截留的窗口或目标。
Mac OS X自动保存到桌面。Png格式。
1从应用程序中找出抓图工具。依次打开应用程序,实用工具,抓图。
打开“捕捉”菜单。工具栏有不少选项,点击“捕捉”,通常紧靠着“编辑”菜单。
这时会出现一个下拉菜单。
选择抓图类型。截图可以是选择部分,窗口,屏幕,屏幕定时。
选择部分,在屏幕上选定特定区域截取。
选择窗口,截取当前特定窗口。
选择屏幕,截取整个屏幕。
选择屏幕定时,延迟10秒截屏。
选中你想截取的区域。如果是“选择部分”,拖拽待截取的区域框。
光标会变成十字。点击,围绕截取区域拖拽十字。
从“文件”菜单中选中“保存”。截图自动出现在屏幕上。接下来就是保存。
文件会存为Tiff 图片。
键入文件名。改个好记的文件名。
如果需要,在“保存”对话框中更改保存路径。
7点击“保存”按钮。保存文件,完成整个过程。
打开终端。依次打开“应用程序”,“实用工具”,“终端”。
这时会打开终端,跳出指令窗口。
键入截图指令。基本截图指令是“screencapture -iW ~/Desktop/screen.jpg”。
切换桌面至任何你想保存图片的文件路径。
更改"screen.jpg" 以匹配文件名,键入截图名。
点击“Enter”键。截取整个屏幕,保存名称、类型和路径。
过程完成。
点击键盘上的“Print Screen”。点击键盘上的“prt sc”键,保存整个屏幕。
同时按下“Alt”键,将截图限定为当前活动窗口。
如果没有这个键,查询键盘说明书,找出相同功能的按键选项。
打开图片编辑器。取决于你正在使用的Ubuntu Linux,没有固定的图片编辑器。选一个电脑里有的,或者选一个你喜欢的。
打开应用程序,附件,找到图片编辑器。
粘贴图片。取决于你用的编辑器,具体有很多方法。所有程序都包含相同的基本操作。点击“Ctrl+v”,粘贴图片。
通常在“文件”或“编辑”菜单下找到粘贴选项。
打开“保存”功能。点击“文件”菜单,点击“保存”或“另存为”。
这时会跳出一个对话框。
键入文件名。改个好记的名字。
如果图形编辑器允许还可以更改文件类型和路径。
6点击“保存”按钮。点击该按钮,或相同功能按钮,保存文件,完成整个过程。
从“应用程序”菜单中找到截图工具。依次打开应用程序,附件,截图。
只有通过GNOME桌面环境才能找到截图应用。其他环境下找不到。
选择截图方法。在截图对话框中选择“抓取整个桌面”“抓取当前窗口”或“选定区域抓取”。看看是否需要延迟抓取。
选中“抓取整个屏幕”,自动截取整个屏幕。
选中“抓取当前窗口”,自动截取当前窗口。
选中“抓取特定区域”,光标变为十字。点击,拖拽矩形,选出你要选定的区域。
设定抓取延迟时间。
设置特效。查看相关选项,看看截图是否包括光标、窗口轮廓。
选中“包括光标”将把光标一起截入图片。取消选中,截图中则不会出现光标。
只有在抓取当前窗口时才可以选中“包括窗口轮廓”。如果选中,那截图中也会包括窗口轮廓。取消选中,则不会包括轮廓。
点击“截图”按钮。点击该按钮截图,按照你的设置保存。
过程完成。
1打开GIMP。如果你的电脑装有高级图片编辑器GIMP,你可以直接利用它截图。打开应用,附件,GIMP。
在“文件”菜单中创建截图。打开“文件”菜单,选择“创建”,从新菜单中选择“截图”。、
这时会打开“截图”对话框。
具体化截图类型。你可以选择“单窗口截图”,“全屏截图”,或“选定区域截图”。
选中“单窗口截图”,GIMP只截取一个窗口。你需要选择一个窗口。
选中“截取整个屏幕”,就会截取当前的全屏。
选中“选定区域截图”,光标会变为十字。点击,拖拽矩形,截取。
看看是否有延迟。你可以更改延迟时间,在“秒数”旁边利用箭头上下滚动,更改数值。
如果你不需要延迟,设为0秒。
点击“快照”按钮。对话框关闭,进行截图。
截图出现在GIMP软件里。
6从文件菜单中选中“另存为”。打开“另存为”对话框,保存截图。
键入文件名。更改合适文件名。
更改路径和文件类型。
8点击“保存”按钮。然后保存截图,完成整个过程。
Windows 剪贴板只用作复制或剪切时的暂时存储空间。粘贴时,项目转移至相应软件。你无法直接操控剪贴板,因为它只用于复制和剪切操作。
本页面已经被访问过1,423次。

我要回帖

更多关于 新建bmp图像 的文章

 

随机推荐