仿造微信截图工具

起因:身处大学身不由己,总有些社团活动需要拉外联啥的,一拉外联就的朋友圈发广告,还不能发私密。为了一劳永逸的解决这个问题,自己用pyhton写了一个类似于p图的代码。

目的:将一张朋友圈截图中的某一矩形区域替换为另一图片中的矩形区域。

原理:利用opencv给图片加上滑动条以及实现截取区域。

使用方法:在source窗口截取矩形区域,在material窗口点击会自动勾出等大矩形区域,按空格保存图片。

不足:滑动条部分,两张图片是共享的,现在懒得改了。。。。

代码:

#include<opencv.hpp>
#include<iostream>using namespace cv;
using namespace std;int h_x = 0, v_y = 0, d_x = 0, d_y = 0;  //记录滑动条变化值,以及保存当前值
Rect v_bar, h_bar;
bool x_change = false;
bool y_change = false; //判断是否改变
bool drawbox = false;
int width, height;
Rect source_rect, _rectangle, product_rect;
int img_x=0, img_y=0;   //记录滑动后截取图片在原图片中的位置
Rect roi_sour, roi_mater;    //进行p图的部分void on_mouse(int event, int x, int y, int flags, void* param);
void draw_scrolls(Mat src_img,Mat& tempimg, const char* title, int width = 1400, int height = 700);
void DrawRect(Mat& img, Rect box);
void on_mouse_2(int event, int x, int y, int flags, void* param);
void ROI_linearBlending(Mat srcImg_1, Mat srcImg_2);int main()
{const char* title = "source";const char* title2 = "material";Mat srcimg = imread("E:\\material\\pyq1.png");Mat srcimg2 = imread("E:\\material\\pyq2.png");Mat dstimg1,dstimg2;Mat tempimg1,tempimg2;namedWindow(title, 1);namedWindow(title2, 1);setMouseCallback(title, on_mouse);setMouseCallback(title2, on_mouse_2);while (true){char c = waitKey(10);draw_scrolls(srcimg, dstimg1,title);draw_scrolls(srcimg2, dstimg2, title2);dstimg1.copyTo(tempimg1);dstimg2.copyTo(tempimg2);if (drawbox){DrawRect(tempimg1, _rectangle);//绘制标识符为真时,画矩形roi_sour=(Rect(_rectangle.x + img_x, _rectangle.y + img_y, _rectangle.width, _rectangle.height));}DrawRect(tempimg2, product_rect);roi_mater = (Rect(product_rect.x+img_x, product_rect.y+img_y, product_rect.width, product_rect.height));if (c == ' ')break;imshow(title, tempimg1);imshow(title2, tempimg2);}ROI_linearBlending(srcimg, srcimg2);waitKey(0);}//图片加滑动条
void draw_scrolls(Mat src_img, Mat& temp_img,const char* title, int width, int height)
{Mat src_rect, temp_rect;Mat src_roi;Rect v_rect, h_rect;int img_width, img_height;  //img的width和heightint win_width, win_height;  //window的width和heightint show_width, show_height;  //窗口中图片的width和heightint bar_width = 25;  //滑动条的宽度double scale_h, scale_w;  //img和window的width,height之比img_width = src_img.cols;img_height = src_img.rows;win_width = show_width = min(img_width, width);win_height = show_height = min(img_height, height);scale_h = (double)img_height / height;scale_w = (double)img_width / width;//高度过高需要加竖直滑动if (scale_h > 1){win_width = img_width > width ? width + bar_width : img_width + bar_width;show_width = win_width - bar_width;}//宽度过宽需要加水平滑动if (scale_w > 1){win_height = img_height > height ? height + bar_width : img_height + bar_width;show_height = win_height - bar_width;}temp_img = Mat::zeros(Size(win_width, win_height), CV_8UC3);if (scale_h > 1){v_y += d_y;d_y = 0;v_y = v_y < 0 ? 0 : (v_y > (int)((1 - 1 / scale_h) * win_height) ? (int)((1 - 1 / scale_h) * win_height) : v_y);img_y = (int)(v_y * img_height / win_height);//img_y = (int)(v_y / ((1-1/scale_h) * win_height) * (1 - 1 / scale_h)*img_height)的简化v_rect = Rect(show_width + 1, 0, bar_width, win_height);  //竖直滑动条底层v_bar = Rect(show_width + 1, v_y, bar_width, (int)((double)win_height / scale_h));  //竖直滑动条rectangle(temp_img, v_rect, Scalar::all(0), -1);rectangle(temp_img, v_bar, Scalar::all(255), -1);}if (scale_w > 1){h_x += d_x;d_x = 0;h_x = h_x < 0 ? 0 : (h_x > (int)((1 - 1 / scale_w) * win_width) ? (int)((1 - 1 / scale_w) * win_width) : h_x);img_x = (int)(h_x * img_width / win_width);//img_y = (int)(v_y / ((1-1/scale_h) * win_height) * (1 - 1 / scale_h)*img_height)的简化h_rect = Rect(0, show_height + 1, win_width, bar_width);  //水平滑动条底层h_bar = Rect(img_x, show_height + 1, (int)((double)win_width / scale_w), bar_width);   //水平滑动条rectangle(temp_img, h_rect, Scalar::all(0), -1);rectangle(temp_img, h_bar, Scalar::all(255), -1);}temp_rect = temp_img(Rect(0, 0, show_width, show_height));   //窗口显示图片部分src_rect = src_img(Rect(img_x, img_y, show_width, show_height));   //原图截取部分src_rect.copyTo(temp_rect);}//在第一张图上截取的部分
void on_mouse(int event, int x, int y, int flags, void* param)
{Point curse = Point(x, y);Point end, now;static Point start = Point(-1, -1);    //定义静态变量//点击滑动条if (event == EVENT_LBUTTONDOWN){start = Point(x, y);if (v_bar.contains(curse))y_change = true;else if (h_bar.contains(curse))x_change = true;else{cout <<start<<"\n";drawbox = true;}}//拖动if (event == EVENT_MOUSEMOVE){if (y_change)                                                        {now = Point(x, y);d_y = now.y - start.y;start = now;}if (x_change){now = Point(x, y);d_x = now.x - start.x;start = now;}if (drawbox){now = Point(x, y);}}if (event == EVENT_LBUTTONUP){x_change = y_change = false;end = Point(x, y);width = end.x - start.x > 0 ? end.x - start.x : start.x - end.x;height = end.y - start.y > 0 ? end.y - start.y : start.y - end.y;source_rect = Rect(start, end);//DrawRect(tempimg1,source_rect);drawbox = false;}_rectangle = Rect(start, now);}//第二章图上截取
void on_mouse_2(int event, int x, int y, int flags, void* param)
{Point curse = Point(x, y);Point end, now;static Point start = Point(-1, -1);bool l_drawbox = false;//点击滑动条if (event == EVENT_LBUTTONDOWN){start = Point(x, y);if (v_bar.contains(curse))y_change = true;else if (h_bar.contains(curse))x_change = true;else{cout << "(" << x << "," << y << ")";product_rect = Rect(x, y, width, height);l_drawbox = true;}}//拖动if (event == EVENT_MOUSEMOVE){if (y_change){now = Point(x, y);d_y = now.y - start.y;start = now;}if (x_change){now = Point(x, y);d_x = now.x - start.x;start = now;}}if (event == EVENT_LBUTTONUP){x_change = y_change = false;l_drawbox = false;}}//画矩形
void DrawRect(Mat& img, Rect box)
{RNG& rng = theRNG();rectangle(img, box.tl(), box.br(), Scalar(rng.uniform(0, 255),rng.uniform(0, 255), rng.uniform(0, 255)));  //以(0,255)内均匀随机数作为矩形颜色
}//p图
void ROI_linearBlending(Mat srcImg_1, Mat srcImg_2)
{Mat	imgROI1, imgROI2, temp1, temp2, dst;srcImg_1.copyTo(temp1);srcImg_2.copyTo(temp2);imgROI1 = temp1(roi_sour);imgROI2 = temp2(roi_mater);addWeighted(imgROI1, 0., imgROI2, 1., 0., imgROI1);imshow("dst", temp1);imwrite("E:\\material\\result1.png", temp1);
}

素材:
素材1
素材2
结果:
改变了头像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/251067.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序学习之自定义对话框、底部弹出框(总结)

在Android开发中&#xff0c;经常需要我们自定义对话框或者底部弹出框&#xff0c;用于满足客户的需求。在微信小程序中&#xff0c;也是如此。 一、自定义对话框 &#xff08;1&#xff09;列表形式。 WXML文件代码如下&#xff1a; <!-- 支付方式对话框 --> <vi…

2020微信对话截图生成器,各种截图一键制作!

前言 上次有朋友说想要个微商作图神器,找了几款觉得功能一般般,就没有发出来,今天又有朋友私信了,对比了这几款,选择中一款不错的给大家分享一下,软件是安卓版的,打开就是VIP,无需去登陆了,直接使用即可&#xff01;嗯&#xff01;拉下去看下详情介绍叭&#xff01; // 软件…

微信小程序之页面中关于聊天框三角形的制作和使用

文章目录 方法一&#xff1a;使用三角形的图片&#xff0c;定位在文本的左侧。方法二&#xff1a;通过在页面中制作一个白色背景的正方形&#xff0c;然后对它进行45度旋转即可实现。方法三&#xff1a;直接制作一个三角形 我最近需要写一个消息通知的页面&#xff0c;需要用到…

微信聊天框

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>微信聊天</title><style>.box{margin: …

Qt实现微信截图功能(一)

简述 Qt 之 简单截图功能&#xff08;一&#xff09;实现鼠标选中区域截图Qt 之 简单截图功能&#xff08;二&#xff09;实现可移动选中区域Qt 之 简单截图功能&#xff08;三&#xff09;实现可拖拽选中区域 在之前的文章中有带大家讲解过部分截图功能&#xff0c;有兴趣的…

高仿微信聊天界面长按弹框样式

效果图 背景 在公司做的项目里面&#xff0c;刚好有需要用到微信聊天界面长按弹框样式这种UI的。 网上找了一下&#xff0c;没找到。 Android现成的 ListPopupWindow又不能满足需求。 因此在非上班时间撸一个出来&#xff0c;供大家使用。 示例代码 关键文件、示例代码及…

截图快捷键ctrl加什么

我们使用电脑聊天&#xff0c;玩游戏或者视频&#xff0c;都经常会使用到截图的功能。使用快捷键截图就会很快速简单&#xff0c;下面小编来告诉大家电脑截图快捷键ctrl加什么。希望可以帮助到大家。 截图快捷键ctrl加什么&#xff1a; ps&#xff1a;要使用ctrl的话&#xf…

数睿通2.0数据血缘、标准、质量功能更新发布

文章目录 引言数据血缘数据标准数据质量结语 引言 这段时间工作繁忙&#xff0c;琐事较多&#xff0c;加上二阳的冲击&#xff0c;导致数睿通 2.0 的更新进度缓慢&#xff0c;深表歉意&#xff0c;还望大家可以理解。本次更新主要包含数据治理模块的血缘&#xff0c;标准&…

Linux cp 命令仅复制文件

参考资料&#xff1a; https://unix.stackexchange.com/questions/101916/copy-only-regular-files-from-one-directory-to-another 作为一个经常进行机器学习训练的人&#xff0c;你可能会想给你的训练代码的每一次run都重新创建一个文件夹&#xff0c;此时你可能只想复制一个…

C++实现cp覆盖指令

前言&#xff1a; 想必大家都知道cp这个命令&#xff0c;现在我要给大家分享一个用命令行参数实现的cp覆盖命令 main函数的命令行参数&#xff1a; int main(int argc,char* argv[]) {} 关于argc与argv[ ] 下面这张图可以助你理解 本图来自&#xff1a;https://blog.csdn.…

cp命令详解

用法&#xff1a; cp [选项]... [-T] 源文件 目标文件 或&#xff1a;cp [选项]... 源文件... 目录 或&#xff1a;cp [选项]... -t 目录 源文件... 功能&#xff1a; 将源文件复制至目标文件&#xff0c;或将多个源文件复制至目标目录。 参数&#xff1a; -a或--ar…

cp (复制)命令

用来将一个或多个源文0件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件&#xff0c;当一次复制多个文件时&#xff0c;目标文件参数必须是一个已经存在的目录&#xff0c;否则…

CP命令

cp命令 拷贝文件&#xff0c;cp 【源文件】 【目标文件】&#xff08;拷贝后的文件可直接对其重命名&#xff09; 拷贝目录&#xff0c;cp -r 【源目录】 【目标目录】 拷贝目录是一定要加-r 否则命令不生效。 复制目录时&#xff0c;最好以/结尾。

cp命令用法

cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件&#xff0c;当一次复制多个文件时&#xff0c;目标文件参数必须是一个已经存在的目录&#xff0…

复制命令 cp

一、命令详解 1.命令说明 cp是copy的缩写,主要是用来复制文件或者目录。cp命令可以将一个或者多个文件、目录复制到一个制定的文件或目录下&#xff0c;也可以同时复制多个文件到一个指定的目录中。 默认情况&#xff0c;cp会被设置一个别名cp is aliased to cp -i&#xff0c…

2022年适合初学者的Python书籍推荐

一、前言 网上有很多Python书或者视频&#xff0c;种类繁多该怎么选择&#xff1f; 看书全是文字看就了眼睛累&#xff0c;也容易厌倦&#xff0c;看视频有时候又觉得讲的慢&#xff0c;有其他方案吗&#xff1f; 其实&#xff0c;关于自学python&#xff0c;找一本浅显易懂&…

推荐几本Python好书!

大家好&#xff01;我是Sitin涛哥&#xff01; 经常有小伙伴问我推荐Python书籍&#xff0c;每次都零零碎碎的。 今天我整理了一些Python3.x编程相关书籍&#xff0c;从基本概念到完整项目开发&#xff0c;并加以数学辅助&#xff0c;帮助你迅速掌握Python编程&#xff0c;成为…

Python入门必备的书籍推荐

想要自学好Python&#xff0c;搜集资料是最关键的一步&#xff0c;现在在网上有很多的资料、视频和网站可供自学入门者选择。但是想要扎扎实实学好基础&#xff0c;书籍是不可少的一种选择&#xff0c;因为书本上的知识还是跟网上的介绍方法有点不一样的&#xff0c;还有书籍上…

清华教授极力推荐的三本入门学习Python书籍

目录 Python入门书&#xff08;适合初学者&#xff09; Python进阶书&#xff08;适合有基础的&#xff09; Python数据科学&#xff08;适合初学者&#xff09; Python入门书&#xff08;适合初学者&#xff09; 这应该是世界上最畅销的Python编程书&#xff0c;没有之一。…

python进阶书籍的推荐-Python 入门到进阶书籍推荐

入门 1.《像计算机科学家一样思考Python (第2版)》 简单、易懂、量少。“这是一本试图用python最小子集来揭示计算机思想的书。”&#xff0c;建议大家读过一遍后&#xff0c;再“练过”一遍。 计算机图书推荐阅读纸质版&#xff0c;条件不允许的话可在【Python 实用宝典】公…