CSDN的博客没水印功能真不方便
用OPENCV简陋地实现了一下
才发现以前用的全都是C风格OpenCV,
而OpenCV的C接口与C++接口的差异真是非常大,今天这个程序一不小心用了C风格,在Cstring和C++string转换上琢磨了半天。
为了规范,又重新C++风写了一遍
其实就是个putText函数
针对C++的接口中putText函数定义为
void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false )
参数为
void logo(string filename) { if(filename.substr(filename.size()-4,4)!=".jpg") return; Mat img = imread(filename); cout<<"converting "<<filename<<" to "; putText(img, "blog.csdn.net/boksic" , Point(0, int(img.rows*0.9)), CV_FONT_HERSHEY_COMPLEX,img.cols/400, cvScalar(200, 200, 200, 0)); filename.insert(0,"new_"); cout<<filename<<endl; imwrite(filename,img); }
vector<string> get_filelist(char *foldname) { vector<string> flist; HANDLE file; WIN32_FIND_DATA fileData; char line[1024]; wchar_t fn[1000]; mbstowcs(fn,(const char*)foldname,999); file = FindFirstFile(fn, &fileData); FindNextFile(file, &fileData); while(FindNextFile(file, &fileData)){ wcstombs(line,(const wchar_t*)fileData.cFileName,259); flist.push_back(line); } return flist; }
vector<string> filelist=get_filelist(".\\*.*"); for(vector<string>::iterator p=filelist.begin();p!= filelist.end();logo(*(p++)));
打水印后的图片