现在的位置: 首页 > 综合 > 正文

使用CImage类切割png图片

2018年07月14日 ⁄ 综合 ⁄ 共 2021字 ⁄ 字号 评论关闭

1.新建一win32控制台应该程序:png,勾选支持MFC

2.新建类:CImageHandler,并在头文件加添加#include <atlimage.h> (CImage头文件)

#pragma once
#include <atlimage.h>
class CImageHandler
{
public:
	CImageHandler(void);
	~CImageHandler(void);
private:
	CImage m_Image;
	void LoadImage();
public:	
	void SplitImage(int dwidth, int dheight);	
};

#include "StdAfx.h"
#include "ImageHandler.h"
#include <iostream>
using namespace std;
CImageHandler::CImageHandler(void)
{
}

CImageHandler::~CImageHandler(void)
{
}

void CImageHandler::LoadImage()
{
	CString strFilter;
	CSimpleArray<GUID> aguidFileTypes;
	HRESULT hResult;

	// 获取CImage支持的图像文件的过滤字符串
	hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T( "All Image Files") );
	if (FAILED(hResult)) {
		AfxMessageBox("GetExporterFilter调用失败!");
		return ;
	}
	CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);
	if(IDOK != dlg.DoModal()) 
		return ;
	m_Image.Destroy();//detach the orignal bitmap of the image if exits and destroy it.
	// 将外部图像文件装载到CImage对象中
	hResult = m_Image.Load(dlg.GetFileName());
	if (FAILED(hResult)) {
		AfxMessageBox("调用图像文件失败!");
		return ;
	}
}
void CImageHandler::SplitImage(int dwidth, int dheight)
{
	LoadImage();
	CRect dRect(0,0,dwidth,dheight);
	CImage newImage;
	BOOL bStat = newImage.Create(dwidth, dheight,m_Image.GetBPP());
	ASSERT(bStat);
	if(!bStat)
	{
		cout<<"bStat is FALSE"<<endl;
		return ;
	}
	POINT p;
	CImageDC imageDC(newImage);	
	int i,j;
	CString fname;
	for(i=0;i<m_Image.GetWidth();i+=dwidth)
		for(j=0;j<m_Image.GetHeight();j+=dheight)
		{
			p.x=i;
			p.y=j;
			m_Image.BitBlt(imageDC,dRect,p);
			fname.Format("c:/testpic/%d_%d.png",i,j);
			newImage.Save(fname);
		}
}

// png.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "png.h"
#include "ImageHandler.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 唯一的应用程序对象

CWinApp theApp;

using namespace std;


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// 初始化 MFC 并在失败时显示错误
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: 更改错误代码以符合您的需要
		_tprintf(_T("错误: MFC 初始化失败\n"));
		nRetCode = 1;
	}
	else
	{
		// TODO: 在此处为应用程序的行为编写代码。
		CImageHandler imgHandler;
		imgHandler.SplitImage(20,20);
		//imgHandler.CaptureScreen(true,"c:/");
	}
	return nRetCode;
}

4.测试图片:

5.分割完成后:

转载:http://blog.csdn.net/snowingsky/article/details/7279778

抱歉!评论已关闭.