Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //sudo apt-get install libpng++-dev
- //g++ watermark.cpp -lpng
- #include "png++/png.hpp"
- #include <iostream>
- #include <fstream>
- #include <ctime>
- using std::cout;
- using std::endl;
- using std::ifstream;
- const int PIX_WID=5;
- const int PIX_HEI=4;
- int px_font_lookup[17][PIX_WID][PIX_HEI] =
- {
- { { 0, 1, 1, 0}, //0
- { 1, 0, 0, 1},
- { 1, 0, 0, 1},
- { 1, 0, 0, 1},
- { 0, 1, 1, 0} },
- { { 0, 1, 0, 0}, //1
- { 1, 1, 0, 0},
- { 0, 1, 0, 0},
- { 0, 1, 0, 0},
- { 1, 1, 1, 0} },
- { { 1, 1, 1, 0}, //2
- { 0, 0, 0, 1},
- { 0, 1, 1, 0},
- { 1, 0, 0, 0},
- { 1, 1, 1, 1} },
- { { 1, 1, 1, 0}, //3
- { 0, 0, 0, 1},
- { 0, 1, 1, 0},
- { 0, 0, 0, 1},
- { 1, 1, 1, 0} },
- { { 1, 0, 0, 1}, //4
- { 1, 0, 0, 1},
- { 1, 1, 1, 1},
- { 0, 0, 0, 1},
- { 0, 0, 0, 1} },
- { { 1, 1, 1, 1}, //5
- { 1, 0, 0, 0},
- { 1, 1, 1, 0},
- { 0, 0, 0, 1},
- { 1, 1, 1, 0} },
- { { 0, 1, 1, 0}, //6
- { 1, 0, 0, 0},
- { 1, 1, 1, 0},
- { 1, 0, 0, 1},
- { 0, 1, 1, 0} },
- { { 1, 1, 1, 1}, //7
- { 0, 0, 0, 1},
- { 0, 0, 1, 0},
- { 0, 1, 0, 0},
- { 0, 1, 0, 0} },
- { { 0, 1, 1, 0}, //8
- { 1, 0, 0, 1},
- { 0, 1, 1, 0},
- { 1, 0, 0, 1},
- { 0, 1, 1, 0} },
- { { 0, 1, 1, 0}, //9
- { 1, 0, 0, 1},
- { 0, 1, 1, 1},
- { 0, 0, 0, 1},
- { 0, 1, 1, 0} },
- { { 0, 0, 0, 1}, // [slash] /
- { 0, 0, 1, 0},
- { 0, 1, 1, 0},
- { 0, 1, 0, 0},
- { 1, 0, 0, 0} },
- { { 0, 0, 0, 0}, // :
- { 0, 1, 1, 0},
- { 0, 0, 0, 0},
- { 0, 1, 1, 0},
- { 0, 0, 0, 0} },
- { { 0, 0, 0, 0}, // [space]
- { 0, 0, 0, 0},
- { 0, 0, 0, 0},
- { 0, 0, 0, 0},
- { 0, 0, 0, 0} },
- { { 0, 1, 1, 0}, //'a' [13]
- { 1, 0, 0, 1},
- { 1, 1, 1, 1},
- { 1, 0, 0, 1},
- { 1, 0, 0, 1} },
- { { 1, 1, 1, 0}, //'p' [14]
- { 1, 0, 0, 1},
- { 1, 1, 1, 0},
- { 1, 0, 0, 0},
- { 1, 0, 0, 0} },
- { { 1, 0, 0, 1}, //'m' [15]
- { 1, 1, 1, 1},
- { 1, 0, 0, 1},
- { 1, 0, 0, 1},
- { 1, 0, 0, 1} },
- { { 1, 0, 0, 0}, //'|' [16]
- { 1, 0, 0, 0},
- { 1, 0, 0, 0},
- { 1, 0, 0, 0},
- { 1, 0, 0, 0} }
- };
- int write_pixel(png::image< png::rgb_pixel >& img, int x, int y, png::rgb_pixel pixel)
- {
- if (0<=y && y<img.get_height() && 0<=x && x<img.get_width()) { img[y][x] = pixel; }
- }
- int write_index(png::image< png::rgb_pixel >& img, int x, int y, int index)
- {
- for(int i=0; i<4; i++)
- {
- for(int j=0; j<5; j++)
- {
- //int v = px_font_lookup[ index ][j][i];
- //int vv = (1-v)*255;//[0,1] maps to [0,255]
- //cout << j <<":" << i <<
- //write_pixel(img, x+i, y+j, png::rgb_pixel(vv, vv, vv)
- if (px_font_lookup[ index ][j][i])
- {
- write_pixel(img, x+i, y+j, png::rgb_pixel(0, 0, 0));
- }
- }
- }
- }
- int write_digit(png::image< png::rgb_pixel >& img, int x, int y, int d){ if (0<=d && d<=9){ write_index(img, x, y, d); } }
- int write_slash(png::image< png::rgb_pixel >& img, int x, int y) { write_index(img, x, y, 10); }
- int write_colon(png::image< png::rgb_pixel >& img, int x, int y) { write_index(img, x, y, 11); }
- int write_space(png::image< png::rgb_pixel >& img, int x, int y) { write_index(img, x, y, 12); }
- int write_a_upp(png::image< png::rgb_pixel >& img, int x, int y) { write_index(img, x, y, 13); }
- int write_p_upp(png::image< png::rgb_pixel >& img, int x, int y) { write_index(img, x, y, 14); }
- int write_m_upp(png::image< png::rgb_pixel >& img, int x, int y) { write_index(img, x, y, 15); }
- int write_date(png::image< png::rgb_pixel >& img, int x, int y, time_t t)
- {
- int z=0;//cursor
- struct tm * lt = localtime(&t);
- int mm = lt->tm_mon+1; int dd = lt->tm_mday; int yyyy = lt->tm_year+1900;
- write_digit(img, x+(z++*5), y, (mm%100)/10);
- write_digit(img, x+(z++*5), y, (mm%10)/1);
- write_slash(img, x+(z++*5), y);
- write_digit(img, x+(z++*5), y, (dd%100)/10);
- write_digit(img, x+(z++*5), y, (dd%10)/1);
- write_slash(img, x+(z++*5), y);
- write_digit(img, x+(z++*5), y, (yyyy%10000)/1000);
- write_digit(img, x+(z++*5), y, (yyyy%1000)/100);
- write_digit(img, x+(z++*5), y, (yyyy%100)/10);
- write_digit(img, x+(z++*5), y, (yyyy%10)/1);
- write_space(img, x+(z++*5), y);
- int hh = lt->tm_hour%12; int ii = lt->tm_min; int ss = lt->tm_sec; int am = lt->tm_hour<=12;
- write_digit(img, x+(z++*5), y, (hh%100)/10);
- write_digit(img, x+(z++*5), y, (hh%10)/1);
- write_colon(img, x+(z++*5), y);
- write_digit(img, x+(z++*5), y, (ii%100)/10);
- write_digit(img, x+(z++*5), y, (ii%10)/1);
- write_colon(img, x+(z++*5), y);
- write_digit(img, x+(z++*5), y, (ss%100)/10);
- write_digit(img, x+(z++*5), y, (ss%10)/1);
- write_space(img, x+(z++*5), y);
- if (am) { write_a_upp(img, x+(z++*5), y); }
- else { write_p_upp(img, x+(z++*5), y); }
- write_m_upp(img, x+(z++*5), y);
- }
- bool file_exists(const char *filename) { ifstream ifile(filename); return ifile.good(); }
- int main(int argc, char **argv)
- {
- char empty[]="";
- char* input_file = empty;
- char* water_file = empty;
- char* output_file = empty;
- if (argc!=7)
- {
- cout << "Usage:" << endl;
- cout << "" << argv[0] << " -i input.png -w watermark.png -o output.png" <<endl;
- exit(0);
- }
- for(int i=1; i<6; i++)
- {
- if (strcmp(argv[i],"-i")==0) { input_file = argv[++i]; }
- else if (strcmp(argv[i],"-w")==0) { water_file = argv[++i]; }
- else if (strcmp(argv[i],"-o")==0) { output_file = argv[++i]; }
- }
- if (!file_exists(input_file )) { cout << "Error: file "<< input_file << " does not exist."<<endl; exit(0); }
- if (!file_exists(water_file )) { cout << "Error: file "<< water_file << " does not exist."<<endl; exit(0); }
- //if (file_exists(output_file)) { cout << "Error: file "<< output_file << " exists."<<endl; exit(0); }
- //overlay watermark, centered
- int start,mwidth,mheight;
- png::image< png::rgb_pixel > img( input_file );
- png::image< png::rgb_pixel > wmark( water_file );
- start = (img.get_width()/2) - (wmark.get_width()/2);
- start = start<0 ? 0 : start;
- mwidth = (start+wmark.get_width()) > img.get_width() ? img.get_width() : (start+wmark.get_width());
- mheight = wmark.get_height() > img.get_height() ? img.get_height() : wmark.get_height();
- for(int i=start; i<mwidth; i++)
- {
- for(int j=0; j<mheight; j++)
- {
- img[j][i] = wmark[j][i-start];
- }
- }
- //write date on watermark
- time_t rawtime = time(NULL);
- write_date(img, start+136, (wmark.get_height()-5)/2, rawtime);
- img.write( output_file );
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment