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.
192 lines
5.5 KiB
192 lines
5.5 KiB
// This may look like C code, but it is really -*- C++ -*-
|
|
//
|
|
// Copyright Bob Friesenhahn, 2001, 2002, 2003
|
|
//
|
|
// Resize image using specified resize algorithm with Magick++ API
|
|
//
|
|
// Usage: zoom [-density resolution] [-filter algorithm] [-geometry geometry]
|
|
// [-resample resolution] input_file output_file
|
|
//
|
|
|
|
#include <Magick++.h>
|
|
#include <iostream>
|
|
#include <string>
|
|
using namespace std;
|
|
using namespace Magick;
|
|
|
|
static void Usage ( char **argv )
|
|
{
|
|
cout << "Usage: " << argv[0]
|
|
<< " [-density resolution] [-filter algorithm] [-geometry geometry]"
|
|
<< " [-resample resolution] input_file output_file" << endl
|
|
<< " algorithm - bessel blackman box catrom cubic gaussian hamming hanning" << endl
|
|
<< " hermite lanczos mitchell point quadratic sample scale sinc triangle" << endl;
|
|
exit(1);
|
|
}
|
|
|
|
static void ParseError (int position, char **argv)
|
|
{
|
|
cout << "Argument \"" << argv[position] << "\" at position" << position
|
|
<< "incorrect" << endl;
|
|
Usage(argv);
|
|
}
|
|
|
|
int main(int argc,char **argv)
|
|
{
|
|
// Initialize ImageMagick install location for Windows
|
|
InitializeMagick(*argv);
|
|
|
|
if ( argc < 2 )
|
|
Usage(argv);
|
|
|
|
enum ResizeAlgorithm
|
|
{
|
|
Zoom,
|
|
Scale,
|
|
Sample
|
|
};
|
|
|
|
{
|
|
Geometry geometry;
|
|
Magick::FilterType filter(LanczosFilter);
|
|
Point density;
|
|
Point resample;
|
|
ResizeAlgorithm resize_algorithm=Zoom;
|
|
|
|
int argv_index=1;
|
|
while ((argv_index < argc - 2) && (*argv[argv_index] == '-'))
|
|
{
|
|
std::string command(argv[argv_index]);
|
|
if (command.compare("-density") == 0)
|
|
{
|
|
argv_index++;
|
|
try {
|
|
density=Geometry(argv[argv_index]);
|
|
}
|
|
catch( exception &/* error_ */)
|
|
{
|
|
ParseError(argv_index,argv);
|
|
}
|
|
argv_index++;
|
|
continue;
|
|
}
|
|
else if (command.compare("-filter") == 0)
|
|
{
|
|
argv_index++;
|
|
std::string algorithm(argv[argv_index]);
|
|
if (algorithm.compare("point") == 0)
|
|
filter=PointFilter;
|
|
else if (algorithm.compare("box") == 0)
|
|
filter=BoxFilter;
|
|
else if (algorithm.compare("triangle") == 0)
|
|
filter=TriangleFilter;
|
|
else if (algorithm.compare("hermite") == 0)
|
|
filter=HermiteFilter;
|
|
else if (algorithm.compare("hanning") == 0)
|
|
filter=HanningFilter;
|
|
else if (algorithm.compare("hamming") == 0)
|
|
filter=HammingFilter;
|
|
else if (algorithm.compare("blackman") == 0)
|
|
filter=BlackmanFilter;
|
|
else if (algorithm.compare("gaussian") == 0)
|
|
filter=GaussianFilter;
|
|
else if (algorithm.compare("quadratic") == 0)
|
|
filter=QuadraticFilter;
|
|
else if (algorithm.compare("cubic") == 0)
|
|
filter=CubicFilter;
|
|
else if (algorithm.compare("catrom") == 0)
|
|
filter=CatromFilter;
|
|
else if (algorithm.compare("mitchell") == 0)
|
|
filter=MitchellFilter;
|
|
else if (algorithm.compare("lanczos") == 0)
|
|
filter=LanczosFilter;
|
|
else if (algorithm.compare("bessel") == 0)
|
|
filter=BesselFilter;
|
|
else if (algorithm.compare("sinc") == 0)
|
|
filter=SincFilter;
|
|
else if (algorithm.compare("sample") == 0)
|
|
resize_algorithm=Sample;
|
|
else if (algorithm.compare("scale") == 0)
|
|
resize_algorithm=Scale;
|
|
else
|
|
ParseError(argv_index,argv);
|
|
argv_index++;
|
|
continue;
|
|
}
|
|
else if (command.compare("-geometry") == 0)
|
|
{
|
|
argv_index++;
|
|
try {
|
|
geometry=Geometry(argv[argv_index]);
|
|
}
|
|
catch( exception &/* error_ */)
|
|
{
|
|
ParseError(argv_index,argv);
|
|
}
|
|
argv_index++;
|
|
continue;
|
|
}
|
|
else if (command.compare("-resample") == 0)
|
|
{
|
|
argv_index++;
|
|
try {
|
|
resample=Geometry(argv[argv_index]);
|
|
}
|
|
catch( exception &/* error_ */)
|
|
{
|
|
ParseError(argv_index,argv);
|
|
}
|
|
argv_index++;
|
|
continue;
|
|
}
|
|
ParseError(argv_index,argv);
|
|
}
|
|
|
|
if (argv_index>argc-1)
|
|
ParseError(argv_index,argv);
|
|
std::string input_file(argv[argv_index]);
|
|
argv_index++;
|
|
if (argv_index>argc)
|
|
ParseError(argv_index,argv);
|
|
std::string output_file(argv[argv_index]);
|
|
|
|
try {
|
|
Image image(input_file);
|
|
if (density.isValid())
|
|
image.density(density);
|
|
density=image.density();
|
|
|
|
if (resample.isValid())
|
|
{
|
|
geometry =
|
|
Geometry(static_cast<size_t>
|
|
(image.columns()*((double)resample.x()/density.x())+0.5),
|
|
static_cast<size_t>
|
|
(image.rows()*((double)resample.y()/density.y())+0.5));
|
|
image.density(resample);
|
|
}
|
|
switch (resize_algorithm)
|
|
{
|
|
case Sample:
|
|
image.sample(geometry);
|
|
break;
|
|
case Scale:
|
|
image.scale(geometry);
|
|
break;
|
|
case Zoom:
|
|
image.filterType(filter);
|
|
image.zoom(geometry);
|
|
break;
|
|
}
|
|
image.write(output_file);
|
|
}
|
|
catch( exception &error_ )
|
|
{
|
|
cout << "Caught exception: " << error_.what() << endl;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|