1. 程式人生 > >在一張圖片上實現截圖功能

在一張圖片上實現截圖功能

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

最後,以後如果有新的方法在記錄。