在一张图片上实现截图功能

C++实现的在一张图片上截图,在此记录两种方便的截图方式:

一、使用ATL和MFC

优点:多字节编码与Unicode通用

缺点:不能跨平台

#include <atlimage.h>

bool shot(const TCHAR* src_img, const TCHAR* dst_img, CRect& rt)
{
bool ret = false;
try
{
CImage src;
if (src.Load(src_img) == S_OK)
{
int w = src.GetWidth();
int h = src.GetHeight();
if ((rt.right <= w) && (rt.bottom <= h))
{
CImage dst;
dst.Create(rt.Width(), rt.Height(), src.GetBPP());
HDC hDc = dst.GetDC();
src.Draw(hDc, 0, 0, dst.GetWidth(), dst.GetHeight(), rt.left, rt.top, rt.Width(), rt.Height());
dst.Save(dst_img);
dst.ReleaseDC();
dst.Destroy();
ret = true;
}
}
src.Destroy();
}
catch (...)
{
}
return ret;

}

二、使用opencv库

优点:支持opencv的平台都能使用

缺点:需要使用其他的库

1.0版相关的头文件

#include <cv.h>
#include <cvaux.h>
#include <cxcore.h>
#include <highgui.h>
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cvaux.lib")
#pragma comment(lib,"highgui.lib")
#pragma comment(lib,"cxcore.lib")

2.0版头文件

#include <cv.h>
#include <highgui.h>
#pragma comment( lib, "opencv_core2410.lib" ) //根据版本不同引用对应的版本
#pragma comment( lib, "opencv_highgui2410.lib" )
#pragma comment( lib, "opencv_imgproc2410.lib" )

bool cvShot(const char* src, const char* dst, CvRect& rt)
{
bool ret = false;
try
{
IplImage* srcImg;
srcImg = cvLoadImage(src, CV_LOAD_IMAGE_COLOR);
if (srcImg)
{
if ((rt.x + rt.width < srcImg->width) && (rt.y + rt.height < srcImg->height))
{
IplImage* dstImg;
CvSize imgsize;
imgsize = cvSize(rt.width, rt.height);
cvSetImageROI(srcImg, rt);
dstImg = cvCreateImage(imgsize, IPL_DEPTH_8U, srcImg->nChannels);
if (dstImg)
{
cvCopy(srcImg, dstImg, 0);
cvResetImageROI(srcImg);
cvSaveImage(dst, dstImg);
cvReleaseImage(&dstImg);
ret = true;
}
}
cvReleaseImage(&srcImg);
}
}
catch (...)
{
}
return ret;
}

2.0以上版截图

bool cvShot(const char* src, const char* dst, Rect& rt)
{
bool ret = false;
cv::Mat srcImg = cv::imread(src, cv::IMREAD_UNCHANGED);
if (!srcImg.empty())
{
cv::Mat dstImg(srcImg, rt);
if (!dstImg.empty())
{
ret = cv::imwrite(dst, dstImg);
}
}
return ret;
}

最后,以后如果有新的方法在记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值