zedwood

pngwatermark.cpp

Jul 2nd, 2013
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.75 KB | None | 0 0
  1. //sudo apt-get install libpng++-dev
  2. //g++ watermark.cpp -lpng
  3. #include "png++/png.hpp"
  4. #include <iostream>
  5. #include <fstream>
  6. #include <ctime>
  7.  
  8. using std::cout;
  9. using std::endl;
  10. using std::ifstream;
  11.  
  12.  
  13. const int PIX_WID=5;
  14. const int PIX_HEI=4;
  15.  
  16. int px_font_lookup[17][PIX_WID][PIX_HEI] =
  17. {
  18.     {   { 0, 1, 1, 0}, //0
  19.         { 1, 0, 0, 1},
  20.         { 1, 0, 0, 1},
  21.         { 1, 0, 0, 1},
  22.         { 0, 1, 1, 0} },
  23.     {   { 0, 1, 0, 0}, //1
  24.         { 1, 1, 0, 0},
  25.         { 0, 1, 0, 0},
  26.         { 0, 1, 0, 0},
  27.         { 1, 1, 1, 0} },
  28.     {   { 1, 1, 1, 0}, //2
  29.         { 0, 0, 0, 1},
  30.         { 0, 1, 1, 0},
  31.         { 1, 0, 0, 0},
  32.         { 1, 1, 1, 1} },
  33.     {   { 1, 1, 1, 0}, //3
  34.         { 0, 0, 0, 1},
  35.         { 0, 1, 1, 0},
  36.         { 0, 0, 0, 1},
  37.         { 1, 1, 1, 0} },
  38.     {   { 1, 0, 0, 1}, //4
  39.         { 1, 0, 0, 1},
  40.         { 1, 1, 1, 1},
  41.         { 0, 0, 0, 1},
  42.         { 0, 0, 0, 1} },
  43.     {   { 1, 1, 1, 1}, //5
  44.         { 1, 0, 0, 0},
  45.         { 1, 1, 1, 0},
  46.         { 0, 0, 0, 1},
  47.         { 1, 1, 1, 0} },
  48.     {   { 0, 1, 1, 0}, //6
  49.         { 1, 0, 0, 0},
  50.         { 1, 1, 1, 0},
  51.         { 1, 0, 0, 1},
  52.         { 0, 1, 1, 0} },
  53.     {   { 1, 1, 1, 1}, //7
  54.         { 0, 0, 0, 1},
  55.         { 0, 0, 1, 0},
  56.         { 0, 1, 0, 0},
  57.         { 0, 1, 0, 0} },
  58.     {   { 0, 1, 1, 0}, //8
  59.         { 1, 0, 0, 1},
  60.         { 0, 1, 1, 0},
  61.         { 1, 0, 0, 1},
  62.         { 0, 1, 1, 0} },
  63.     {   { 0, 1, 1, 0}, //9
  64.         { 1, 0, 0, 1},
  65.         { 0, 1, 1, 1},
  66.         { 0, 0, 0, 1},
  67.         { 0, 1, 1, 0} },
  68.     {   { 0, 0, 0, 1}, // [slash] /
  69.         { 0, 0, 1, 0},
  70.         { 0, 1, 1, 0},
  71.         { 0, 1, 0, 0},
  72.         { 1, 0, 0, 0} },
  73.     {   { 0, 0, 0, 0}, // :
  74.         { 0, 1, 1, 0},
  75.         { 0, 0, 0, 0},
  76.         { 0, 1, 1, 0},
  77.         { 0, 0, 0, 0} },
  78.     {   { 0, 0, 0, 0}, // [space]
  79.         { 0, 0, 0, 0},
  80.         { 0, 0, 0, 0},
  81.         { 0, 0, 0, 0},
  82.         { 0, 0, 0, 0} },
  83.     {   { 0, 1, 1, 0}, //'a' [13]
  84.         { 1, 0, 0, 1},
  85.         { 1, 1, 1, 1},
  86.         { 1, 0, 0, 1},
  87.         { 1, 0, 0, 1} },
  88.     {   { 1, 1, 1, 0}, //'p' [14]
  89.         { 1, 0, 0, 1},
  90.         { 1, 1, 1, 0},
  91.         { 1, 0, 0, 0},
  92.         { 1, 0, 0, 0} },
  93.     {   { 1, 0, 0, 1}, //'m' [15]
  94.         { 1, 1, 1, 1},
  95.         { 1, 0, 0, 1},
  96.         { 1, 0, 0, 1},
  97.         { 1, 0, 0, 1} },
  98.     {   { 1, 0, 0, 0}, //'|' [16]
  99.         { 1, 0, 0, 0},
  100.         { 1, 0, 0, 0},
  101.         { 1, 0, 0, 0},
  102.         { 1, 0, 0, 0} }
  103. };
  104.  
  105. int write_pixel(png::image< png::rgb_pixel >& img, int x, int y, png::rgb_pixel pixel)
  106. {
  107.     if (0<=y && y<img.get_height() && 0<=x && x<img.get_width()) { img[y][x] = pixel; }
  108. }
  109.  
  110. int write_index(png::image< png::rgb_pixel >& img, int x, int y, int index)
  111. {
  112.     for(int i=0; i<4; i++)
  113.     {
  114.         for(int j=0; j<5; j++)
  115.         {
  116.             //int v = px_font_lookup[ index ][j][i];
  117.             //int vv = (1-v)*255;//[0,1] maps to [0,255]
  118.             //cout << j <<":" << i <<
  119.             //write_pixel(img, x+i, y+j, png::rgb_pixel(vv, vv, vv)
  120.             if (px_font_lookup[ index ][j][i])
  121.             {
  122.                 write_pixel(img, x+i, y+j, png::rgb_pixel(0, 0, 0));
  123.             }
  124.         }
  125.     }
  126. }
  127.  
  128. 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); } }
  129. int write_slash(png::image< png::rgb_pixel >& img, int x, int y) { write_index(img, x, y, 10); }
  130. int write_colon(png::image< png::rgb_pixel >& img, int x, int y) { write_index(img, x, y, 11); }
  131. int write_space(png::image< png::rgb_pixel >& img, int x, int y) { write_index(img, x, y, 12); }
  132. int write_a_upp(png::image< png::rgb_pixel >& img, int x, int y) { write_index(img, x, y, 13); }
  133. int write_p_upp(png::image< png::rgb_pixel >& img, int x, int y) { write_index(img, x, y, 14); }
  134. int write_m_upp(png::image< png::rgb_pixel >& img, int x, int y) { write_index(img, x, y, 15); }
  135.  
  136. int write_date(png::image< png::rgb_pixel >& img, int x, int y, time_t t)
  137. {
  138.     int z=0;//cursor
  139.     struct tm * lt = localtime(&t);
  140.  
  141.     int mm = lt->tm_mon+1; int dd = lt->tm_mday; int yyyy = lt->tm_year+1900;
  142.     write_digit(img, x+(z++*5), y, (mm%100)/10);
  143.     write_digit(img, x+(z++*5), y, (mm%10)/1);
  144.     write_slash(img, x+(z++*5), y);
  145.     write_digit(img, x+(z++*5), y, (dd%100)/10);
  146.     write_digit(img, x+(z++*5), y, (dd%10)/1);
  147.     write_slash(img, x+(z++*5), y);
  148.     write_digit(img, x+(z++*5), y, (yyyy%10000)/1000);
  149.     write_digit(img, x+(z++*5), y, (yyyy%1000)/100);
  150.     write_digit(img, x+(z++*5), y, (yyyy%100)/10);
  151.     write_digit(img, x+(z++*5), y, (yyyy%10)/1);
  152.     write_space(img, x+(z++*5), y);
  153.  
  154.     int hh = lt->tm_hour%12; int ii = lt->tm_min; int ss = lt->tm_sec; int am = lt->tm_hour<=12;
  155.     write_digit(img, x+(z++*5), y, (hh%100)/10);
  156.     write_digit(img, x+(z++*5), y, (hh%10)/1);
  157.     write_colon(img, x+(z++*5), y);
  158.     write_digit(img, x+(z++*5), y, (ii%100)/10);
  159.     write_digit(img, x+(z++*5), y, (ii%10)/1);
  160.     write_colon(img, x+(z++*5), y);
  161.     write_digit(img, x+(z++*5), y, (ss%100)/10);
  162.     write_digit(img, x+(z++*5), y, (ss%10)/1);
  163.     write_space(img, x+(z++*5), y);
  164.     if (am) { write_a_upp(img, x+(z++*5), y); }
  165.     else    { write_p_upp(img, x+(z++*5), y); }
  166.     write_m_upp(img, x+(z++*5), y);
  167. }
  168.  
  169. bool file_exists(const char *filename) { ifstream ifile(filename); return ifile.good(); }
  170.  
  171.  
  172. int main(int argc, char **argv)
  173. {
  174.     char empty[]="";
  175.     char* input_file = empty;
  176.     char* water_file = empty;
  177.     char* output_file = empty;
  178.  
  179.     if (argc!=7)
  180.     {
  181.         cout << "Usage:" << endl;
  182.         cout << "" << argv[0] << " -i input.png -w watermark.png -o output.png" <<endl;
  183.         exit(0);
  184.     }
  185.     for(int i=1; i<6; i++)
  186.     {
  187.         if      (strcmp(argv[i],"-i")==0) { input_file = argv[++i]; }
  188.         else if (strcmp(argv[i],"-w")==0) { water_file = argv[++i]; }
  189.         else if (strcmp(argv[i],"-o")==0) { output_file = argv[++i]; }
  190.     }
  191.     if (!file_exists(input_file )) { cout << "Error: file "<< input_file  << " does not exist."<<endl; exit(0); }
  192.     if (!file_exists(water_file )) { cout << "Error: file "<< water_file  << " does not exist."<<endl; exit(0); }
  193.     //if (file_exists(output_file)) { cout << "Error: file "<< output_file << " exists."<<endl; exit(0); }
  194.  
  195.     //overlay watermark, centered
  196.     int start,mwidth,mheight;
  197.     png::image< png::rgb_pixel > img( input_file );
  198.  
  199.     png::image< png::rgb_pixel > wmark( water_file );
  200.     start = (img.get_width()/2) - (wmark.get_width()/2);
  201.     start = start<0 ? 0 : start;
  202.     mwidth = (start+wmark.get_width()) > img.get_width() ? img.get_width() : (start+wmark.get_width());
  203.     mheight = wmark.get_height() > img.get_height() ? img.get_height() : wmark.get_height();
  204.     for(int i=start; i<mwidth; i++)
  205.     {
  206.         for(int j=0; j<mheight; j++)
  207.         {
  208.             img[j][i] = wmark[j][i-start];
  209.         }
  210.     }
  211.    
  212.     //write date on watermark
  213.     time_t rawtime = time(NULL);
  214.     write_date(img, start+136, (wmark.get_height()-5)/2, rawtime);
  215.    
  216.     img.write( output_file );
  217.  
  218.     return 0;
  219. }
Advertisement
Add Comment
Please, Sign In to add comment