You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

164 lines
5.2 KiB

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <X11/Xlib.h>
using namespace cv;
Rect2d getSelection(Mat img, char* title, bool fromCenter, bool showCrosshair){
Rect2d r = selectROI(title, img, fromCenter, showCrosshair);
if(r.empty()){
std::cout << "Cancelled selection, exiting.\n";
exit(0);
}
return r;
}
Mat getImgFromFile(char* impath){
Mat img = imread(impath);
if(img.empty())
{
std::cerr<< "Could not read image from: " << impath << std::endl;
exit(1);
}
return img;
}
Mat getImgFromClipboard(){
// TODO implement a C++ implementation instead
system("xclip -o -selection clipboard > /tmp/from.png");
Mat img = imread("/tmp/from.png");
if(img.empty())
{
std::cerr<< "Could not read image from clipboard. "<< std::endl;
exit(1);
}
return img;
}
void saveImgToClipboard(Mat img){
// TODO implement a C++ implementation instead
imwrite("/tmp/to.png", img);
system("xclip -selection clipboard -target image/png -i /tmp/to.png");
}
void exitHelp(){
const char* HELP_TEXT = "Usage:\n"
" simcrop [OPTION?] -f(c) [PATH?] -s(c) [PATH?]\n\n"
"Help Options:\n"
" -h, --help Show help options\n\n"
"Application Options:\n"
" -c, --center Select from center\n"
" -x, --crosshair Show crosshair\n\n"
"From & To:\n"
" -f(c) [PATH] Image to crop, adding c fetches the image from clipboard\n"
" -s(c) [PATH] Path to save cropped, adding c saves the image to clipboard\n\n"
"Keybinds:\n"
" * In selection, press enter or space to confirm.\n"
" * To cancel, press c in selection window.\n"
" * In confirmation, press q to exit and s to save.\n";
std::cout << HELP_TEXT << "\n";
exit(0);
}
int main(int argc, char** argv)
{
bool showCrosshair = false;
bool selectFromCenter = false;
Mat fromImg = Mat();
bool saveClipboard = false;
char* savePath = "";
char* title = "SimCrop";
if(argc < 3){
std::cout << "Not enough parameters!\n";
exitHelp();
}
for (int i = 0; i < argc; ++i){
if(argv[i][0] != '-'){
continue;
}
if(!strcmp(argv[i], "-h")){
exitHelp();
}else if(!(strcmp(argv[i], "-c") && strcmp(argv[i], "--center"))){
selectFromCenter = true;
}else if(!(strcmp(argv[i], "-x") && strcmp(argv[i], "--crosshair"))){
showCrosshair = true;
}else if(!(strcmp(argv[i], "-t") && strcmp(argv[i], "--title"))){
if(argc <= i+1){
std::cerr << "You must provide a string with -t!\n";
exitHelp();
}
title = argv[i+1];
}else if(!strcmp(argv[i], "-f")){
if(!fromImg.empty()){
std::cerr << "You can only provide one from argument!\n";
exitHelp();
}
if(argc <= i+1){
std::cerr << "You must provide a path with -f!\n";
exitHelp();
}
fromImg = getImgFromFile(argv[i+1]);
}else if(!strcmp(argv[i], "-s")){
if(strcmp(savePath, "") || saveClipboard){
std::cerr << "You can only provide one save argument!\n";
exitHelp();
}
if(argc <= i+1){
std::cerr << "You must provide a path with -s!\n";
exitHelp();
}
savePath = argv[i+1];
}else if(!strcmp(argv[i], "-fc")){
if(!fromImg.empty()){
std::cerr << "You can only provide one from arguement!\n";
exitHelp();
}
fromImg = getImgFromClipboard();
}else if(!strcmp(argv[i], "-sc")){
if(strcmp(savePath, "") || saveClipboard){
std::cerr << "You can only provide one save argument!\n";
exitHelp();
}
saveClipboard = true;
}else{
std::cout << "Unknown parameter " << argv[i] << "\n";
exitHelp();
}
}
printf("%d", fromImg.empty());
if(!(saveClipboard || strcmp(savePath, "")) || fromImg.empty()){
std::cerr << "From and To arguements are mandatory!\n";
exitHelp();
}
uint8_t key = 98;
Mat cropped = Mat();
Rect2d selection = Rect2d();
while(key == 98){
selection = getSelection(fromImg, title, selectFromCenter, showCrosshair);
cropped = fromImg(selection);
imshow(title, cropped);
do{
key = waitKey(1);
}while(key != 113 && key != 115 && key != 98);
}
if(key == 113){
return 0;
}
if(saveClipboard){
saveImgToClipboard(cropped);
}else{
imwrite(savePath, cropped);
}
return 0;
}