Advertisement
vinvinod

Untitled

Dec 25th, 2013
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.    
  2.  
  3.     /* compile with
  4.      *
  5.      *      g++ -Wall test_image_resize.cpp `pkg-config vipsCC --cflags --libs`
  6.      *
  7.      */
  8.      
  9.     #include <iostream>
  10.     #include <fstream>
  11.     #include <sstream>
  12.     #include <string>
  13.     #include <algorithm>
  14.    
  15.     #include <vips/vips>
  16.     #include <vips/vips.h>
  17.      
  18.     #define PROGRESSIVE 1
  19.  
  20.     /* Macro to convert integer to string */
  21.     #define SSTR( x ) dynamic_cast< std::ostringstream & > ( ( std::ostringstream() << std::dec << x ) ).str()
  22.  
  23.    
  24.  
  25.     /**
  26.      *
  27.      * @param inputname : absolute path of the file. [ /home/vinod/test_code/test.cpp ]
  28.      * @param path      : the path. [ /home/vinod/test_code ]
  29.      * @param name      : the name. [ test ]
  30.      * @param ext       : the extension. [ cpp ]
  31.      */
  32.     void split_path_name_ext(std::string &inputname, std::string &path, std::string &name, std::string &ext)
  33.     {
  34.             path = inputname.substr(0, inputname.find_last_of("/"));
  35.             name = inputname.substr(inputname.find_last_of("/") + 1,
  36.                                     inputname.find_last_of(".") - inputname.find_last_of("/") - 1);
  37.             ext = inputname.substr(inputname.find_last_of(".") + 1);
  38.             return;
  39.     }
  40.    
  41.     /**
  42.      *
  43.      * @param ifilename : name of the image file to be resized.
  44.      * @return 0 on success.
  45.      */
  46.     int image_resize(std::string& ifilename)
  47.     {
  48.        
  49.        
  50.         int height[]={1080,720,480,360,240};
  51.         int n_files = sizeof(height)/sizeof(height[0]);
  52.         std::string path , name , ext;
  53.         split_path_name_ext(ifilename,path,name,ext);
  54.        
  55.         /* The vips7 C++ interface doesn't support the open mode we need.
  56.          */
  57.         VipsImage *x;
  58.         std::transform(ext.begin(),ext.end(),ext.begin(),::tolower);
  59.  
  60.         if (vips_foreign_load (ifilename.c_str (), &x, NULL)){
  61.             std::cout<<"cant load - "<<ifilename<<std::endl;
  62.             return -1;
  63.         }
  64.  
  65.            
  66.  
  67.         vips::VImage im (x);
  68.         im._ref->close_on_delete = 1;
  69.         double aspect_ratio = double(im.Xsize()) / double(im.Ysize());
  70.        
  71.         vips::VImage * out;
  72.         out = new vips::VImage [n_files + 1];
  73.         out[0] = im;
  74.         int k=0;
  75.         for(int i=0; i < n_files ; i++)
  76.         {
  77.             int input_height = out[i].Ysize();
  78.             int target_height = height[i];
  79.             int target_width = (int(target_height * aspect_ratio) /2 )*2;
  80.            
  81.             /* I need not upsample */
  82.             if (target_height > input_height) {
  83.                 out[i + 1] = out[i];
  84.                 continue;
  85.             }
  86.            
  87.             double scale = target_height / (double) input_height;
  88.             /* Shrink to integer factor first - This is faster
  89.              */
  90.             int shrink_factor = floor (1.0 / scale);
  91.             if ((1.0 / scale) > 2.0)
  92.             {
  93.               out[i] = out[i].shrink (double (shrink_factor), double (shrink_factor));
  94.             }
  95.            
  96.             /* tilecache is not exposed by the vips7 C++ interface, sadly.
  97.              */
  98.             if(ext.find("png")!=std::string::npos ){
  99.                 int tile_width;
  100.                 int tile_height;
  101.                 int nlines;
  102.                 VipsImage * temp;
  103.                 vips_get_tile_size (out[i].image (), &tile_width, &tile_height, &nlines);
  104.                 if (vips_tilecache (out[i].image (), &temp,
  105.                                   "tile_width", out[i].Xsize (),
  106.                                   "tile_height", 10,
  107.                                   "max_tiles", (nlines * 2) / 10,
  108.                                   "access", VIPS_ACCESS_SEQUENTIAL,
  109.                                   "threaded", TRUE, NULL))
  110.                 vips_error_exit ("can't cache");
  111.                 out[i+1] = vips::VImage(temp);
  112.                 out[i+1]._ref->close_on_delete = 1;
  113.                 out[i+1]._ref->addref (out[i]._ref);
  114.             }
  115.             else
  116.                 out[i+1] = out[i];
  117.            
  118.             /* Use affine transform to get to the required size */
  119.             int height_aft_shrink = floor (input_height / shrink_factor);
  120.  
  121.             scale = target_height / (double) height_aft_shrink;
  122.             out[i+1] = out[i+1].affinei ("bicubic", scale, 0, 0, scale,
  123.                              0, 0, 0, 0, target_width, target_height);
  124.            
  125.             /* Apply Sharpening Filter */
  126.             if (target_width < 150 || target_height < 150)
  127.             {
  128.                 /* Sharpening Filter*/
  129.                 vips::VIMask sharpen_filter (3, 3, 8, 0,
  130.                                            -1, -1, -1, -1, 16, -1, -1, -1, -1);
  131.                 out[i+1] = out[i+1].conv (sharpen_filter);
  132.             }
  133.            
  134.            
  135.             std::string ofilename = path + "/" + name + "_" + SSTR(target_height) + ".jpg";
  136.             std::cout << "starting save for " << ofilename << " ..." << std::endl;    
  137.             if (vips_foreign_save ((VipsImage *) (out[i+1].image ()),
  138.                                     (char *) ofilename.c_str (),
  139.                                     "interlace", PROGRESSIVE, NULL))
  140.             {
  141.               std::cout << "Error in saving file: " << ofilename << std::endl;
  142.               std::cout << vips_error_buffer () << std::endl;
  143.             }
  144.             else
  145.                 k++;
  146.            
  147.         }
  148.         delete [] out;
  149.         return 0;
  150.        
  151.     }
  152.      
  153.     int
  154.     main (int argc, char **argv)
  155.     {
  156.       if (vips_init (argv[0]))
  157.          vips_error_exit ("unable to init");
  158.      
  159.       GOptionContext *context;
  160.       GError *error = NULL;
  161.      
  162.       context = g_option_context_new ("- test prog");
  163.      
  164.       g_option_context_add_group (context, vips_get_option_group ());
  165.      
  166.       if (!g_option_context_parse (context, &argc, &argv, &error))
  167.         {
  168.           if (error)
  169.             {
  170.               fprintf (stderr, "%s\n", error->message);
  171.               g_error_free (error);
  172.             }
  173.      
  174.           vips_error_exit ("try \"%s --help\"", g_get_prgname ());
  175.         }
  176.      
  177.       g_option_context_free (context);
  178.      
  179.      
  180.      
  181.       for(int i=1;i<20;i++) {
  182.           std::string filelist("/home/vinod/simple_tests/filelist.txt");
  183.           std::ifstream filehandle(filelist.c_str());
  184.           while(!filehandle.eof())
  185.           {
  186.               std::string ifilename;
  187.               getline(filehandle, ifilename);
  188.               if(ifilename.size()!=0)
  189.               {
  190.                   image_resize(ifilename);
  191.               }
  192.           }
  193.           filehandle.close();
  194.       }
  195.      
  196.       return 0;
  197.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement