VC裁剪bmp

原创 2016年08月31日 09:29:10
#include <atlimage.h>
#include <gdiplus.h>
#include <fstream>
using namespace cv;
using namespace std;

typedef struct mw_Rect{
	int x ;
	int y ;
	int width ;
	int height ;
}mw_Rect;

/*****************************************************
功能:
	输入bmp字节流,按照指定大小区域裁剪输出bmp字节流
参数:
	bmp[in]	需要裁剪的bmp字节流(包含头信息的完整bmp)
	len[in]	需要裁剪的bmp字节流的长度
	lenOut[out]	裁剪出来的bmp字节流长度
	rect[in]	裁剪的区域大小矩形框
返回值:
	返回裁剪处理啊的bmp字节流,包含头信息,直接
	写到文件中就是一个bmp文件
*****************************************************/
unsigned char* CutImg2(unsigned char *bmp , int len , int *lenOut , mw_Rect rect){
	int lbx, lby, cutwidth, cutheight;

	lbx=rect.x;//²Ã¼ôÆðʼλÖã¨×óϽÇ×ø±êϵ£©
	lby=rect.y;//
	cutwidth=rect.width;//²Ã¼ôµÄ¿í¶È
	cutheight=rect.height;//²Ã¼ôµÄ¸ß¶È

	BITMAPFILEHEADER myfileHdr; 
	BITMAPINFOHEADER mySinfo,myDinfo; 
	memcpy_s(&myfileHdr , sizeof(myfileHdr) , bmp , sizeof(myfileHdr));
	memcpy_s(&mySinfo , sizeof(mySinfo) , bmp+sizeof(myfileHdr) , sizeof(mySinfo));
	DWORD dwSize = (mySinfo.biWidth * mySinfo.biBitCount + 31) / 32 * 4 * mySinfo.biHeight;
	PBYTE pBufs = new BYTE[dwSize];
	memcpy_s(pBufs , dwSize , bmp+sizeof(myfileHdr)+sizeof(mySinfo) , dwSize);

	DWORD dwSize1 = (cutwidth * 24 + 31) / 32 * 4 *cutheight; //¼ÆËãÄ¿µÄÎļþλͼÊý¾ÝµÄ´óС
	DWORD dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwSize1; 
	DWORD dwSize2 = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);
	
	myfileHdr.bfType = 0x4D42; // "BM"
	myfileHdr.bfSize = dwDIBSize; 
	myfileHdr.bfReserved1 = 0; 
	myfileHdr.bfReserved2 = 0; 
	myfileHdr.bfOffBits = dwSize2;
	
	myDinfo.biWidth = cutwidth; //ÉèÖÃÄ¿µÄÎļþµÄ¿í¶È
	myDinfo.biHeight = cutheight; //ÉèÖÃÄ¿µÄÎļþµÄ¸ß¶È
	myDinfo.biSize   = sizeof(BITMAPINFOHEADER);
	myDinfo.biPlanes   = 1;
	myDinfo.biBitCount = 24;
	myDinfo.biCompression = BI_RGB;
	myDinfo.biSizeImage = 0;
	myDinfo.biXPelsPerMeter = 0;
	myDinfo.biYPelsPerMeter = 0;
	myDinfo.biClrImportant = 0;
	myDinfo.biClrUsed = 0;

	PBYTE pBufd = new BYTE[dwSize1]; //ÉùÃ÷Ä¿µÄÎļþλͼÐÅÏ¢Äڴ滺³åÇø
	BYTE *pSrc, *pDes;
	int j=0;
	for(int i = lby; i < myDinfo.biHeight + lby; i++) 
	{ 
	      pSrc = pBufs + (mySinfo.biWidth * mySinfo.biBitCount + 31) / 32 * 4 * i + lbx * 3; //Ö¸¶¨×ø±êµãµÄ¶¨Î»
	      pDes = pBufd + (myDinfo.biWidth * myDinfo.biBitCount + 31) / 32 * 4 * j;  
	      memcpy(pDes, pSrc, (myDinfo.biWidth * myDinfo.biBitCount + 31) / 32 * 4); 
	      j++;
		  //::MessageBox(NULL,pSrc,"aaaa",MB_OK|MB_ICONINFORMATION);
	}
	*lenOut = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwSize1;
	unsigned char *cutImg = new unsigned char[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwSize1];
	memset(cutImg,0,sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwSize1);

	memcpy_s(cutImg , sizeof(BITMAPFILEHEADER) , &myfileHdr , sizeof(BITMAPFILEHEADER));
	memcpy_s(cutImg+sizeof(BITMAPFILEHEADER) , sizeof(BITMAPINFOHEADER) , &myDinfo , sizeof(BITMAPINFOHEADER));
	memcpy_s(cutImg+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) , dwSize , pBufd , dwSize1);
	delete[] pBufs;
	pBufs = NULL;
	delete[] pBufd;
	pBufd = NULL;
	return cutImg;
}

GDI+裁剪图片

1.首先在VC下创建一个对话框程序。 2.在stdafx.h头文件中加入如下代码:#include //#ifndef ULONG_PTR //#define ULONG_PTR unsigned...
  • tg2003
  • tg2003
  • 2015年05月01日 20:53
  • 1418

【数字图像处理】<纯C++>读取、裁剪、缩放、旋转和存储8位bmp灰度图像

原文:http://blog.csdn.net/zhengtu009/article/details/17220319 C++实现以下功能: 1、实现对硬盘中的8位BMP图像的读取和存储;...
  • huang546213693
  • huang546213693
  • 2014年11月27日 20:43
  • 2827

VC++中bmp图象的显示

前段时间想用VC的对话框来动态地显示一副BMP位图,查了很多篇文章发现都写的很复杂(而且貌似许多都是复制粘贴而来),真正有价值的不多.其实VC显示BMP文件是很方便的,所有的代码加在一起也不过五六行而...
  • u012252959
  • u012252959
  • 2017年03月22日 19:23
  • 681

VC6.0读取BMP图像信息到BYTE数组

From:http://blog.sina.com.cn/s/blog_8bdd25f80101900h.html
  • SSJJRRRR
  • SSJJRRRR
  • 2014年09月20日 20:44
  • 882

VC/MFC读取BMP文件并显示

自己写过的代码,留作保存,以后不会忘了 先声明几个变量 BYTE * pBMPDataBuf;//BMP数据buf BITMAPFILEHEADER BmpHeader;//BMP图像文件头 ...
  • fqzlala
  • fqzlala
  • 2013年02月19日 16:17
  • 2292

VC打开并缩放显示位图(.BMP)文件的方法

VC打开并缩放显示位图(.BMP)文件的方法 最近一个项目需要进行位图操作,网上找了一大堆资料,但发现都是以前VC6.0版本的抄来抄去,而且大多数使用了复杂的位图结构。所以自己通过查阅MSD...
  • lxw907304340
  • lxw907304340
  • 2015年05月05日 14:19
  • 1330

MFC 显示bmp图片

首先从工具箱中选择一个Picture Control 和3个Button到对话框 取Picture Control 的 ID 为IDC_STATIC_PICURE 然后添加bmp资源文件 ...
  • fulianzhou
  • fulianzhou
  • 2015年10月17日 11:39
  • 1601

【数字图像处理一】BMP图像的读取

VC6.0显示24位BMP图像
  • u013580497
  • u013580497
  • 2015年07月07日 10:05
  • 1496

VC屏幕截图并保存为bmp文件

保存抓图的简单实现 实现类似的抓屏功能(简单的截图功能) 其实只要两个函数就行了,以下从网上摘抄的一段代码的改写, 算是原创吧 (http://www.wenyiwen.cn/a24/how...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年04月17日 13:47
  • 994

SetPixel去显示BMP图

最近学习一下图形的知识,一直对位图不太了解,自己开发当中一般都是直接用CIMage 或者别的图形类来进行图形处理,一些本质东西不知道,总感觉比较虚。因为在一些特殊的环境是需要这些知识。 知识引用: ...
  • XiaoZuoay
  • XiaoZuoay
  • 2015年04月27日 17:35
  • 664
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC裁剪bmp
举报原因:
原因补充:

(最多只允许输入30个字)