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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

C++实现以下功能:1、实现对硬盘中的8位BMP图像的读取和存储;2、实现对指定矩形框区域图像的剪切;3、实现对任意形状图像的任意比例缩放;4、实现对任意形状图像的任意角度选装。 程序编辑环境:在vi...

图片裁剪工具类(支持jpg,png,bmp,gif(剪切后为静态))

package com.util; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.F...

vc++6.0 图象裁剪与填充

  • 2009-10-18 23:05
  • 445KB
  • 下载

vc6.0使用gdi+在内存中绘图并将其保存为bmp,jpg,gif,png等格式的图片

刚开始使用的是gdi保存cview中的绘图内容,但是发现由于保存的是位图所以保存下来的图片的大小很大,每个大概有2M左右,所以在网上找解决方法,选择使用GDI+来保存绘图为图片,大小为20K左右,主要...
  • zhha86
  • zhha86
  • 2011-11-28 11:00
  • 4022

vc++ bmp图像二值化

在网上看到2个例子: 方法一:http://blog.csdn.net/mydreamremindme/article/details/9950453      我生成的不是白色底,是蓝色底不知道为...

GDI/GDI+(2): VC中,保存HBITMAP到bmp文件方法

首先附上一段MSDN的文章,在MSDN搜索GetObject,便可得到这篇文章 Storing an Image Many applications store images perman...
  • oldmtn
  • oldmtn
  • 2012-04-20 09:42
  • 2624

VC_概念_BMP文件格式

验证过后发现: 几个特点: BMP原图格式是有信息头的,共0x00~0x35个字节,从0x36开始数据区域,并且是从左下角到右上角顺序 转换后的C源是0x00~开始的数据区域,并且是...

VC++中bmp图象的显示

转自:http://www.cnblogs.com/jjzhou1988/archive/2009/07/22/1347862.html 前段时间想用VC的对话框来动态地显示一副BMP位图,查了很多...

VC读取多张bmp图片。像幻灯片一样一个一个全屏显示

来自 http://blog.csdn.net/fyi2010/article/details/6253660 功能:读取多张bmp图片。像幻灯片一样一个一个全屏显示。 void Cs...

VC++信息安全编程(9)基于24位bmp位图的信息隐藏

信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是透明的。传统的信息隐藏起源于古老的隐写术。如在古希腊战争中,为了安全地传送军事情报,奴隶主...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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