How do I resize, then convert an image type with CGI::ImageMagick?

I am having so much trouble figuring this out. Below is a verbose example with many issues, but hopefully excusing this beginner's attempt, someone will guide me on how to do this.

use LWP::Simple;
use Image::Resize;
use CGI::ImageMagick;

sub convertandsave {
    # This is my remote site where I am grabbing the image from
    my $url = 'http://someremotedomain.example.com/';

    # Actually, the $image name is $_[0], but for this post I wanted to be clear
    my $image = '6226701.bmp';

    # Displays full size
    my $showimage = '<img src="$url/$image">';
    print qq~Full Size: $showimage <br />~;

    # this is crude, but I absolutely know the last three chars are the image type
    my $image       = lc '6226701.bmp';
    my $remoteimage = "$url/$image";
    my $imagetype   = substr($image, -3, 3);
    print qq~$imagetype<br />~;

    # Save the full sized image locally
    my $savelocal = LWP::Simple::getstore($imageurl, $image);

    # Below are notes and attempts
    # convert a.bmp a.jpg;????
    # if ($imagetype ne 'jpg'){
    #     my $cmd = "imgcvt -i $imagetype -o jpg $old.$cnt $new.$cnt";
    #     print $cmd."\n";
    #     if (system($cmd)) { print "imgcvt failed\n"; }
    # }

    my $thumb = $image;
    my @thumb = split(/./, $thumb);
    my $new   = "$thumb[0].jpg";

    #my $gd = $image1->convert($image1, $new);
    my $new = new CGI::ImageMagick(size => '120x100');
    my $thumb = new CGI::ImageMagick(convert => $image, $new);

    #my $magick> convert rose.jpg rose.png;
    #my $gd = $image1->convert(120, 120);
    # This did work for resizing
    my $thumbnail = Image::Resize->new($image);
    my $gd = $thumbnail->resize(120, 120);

    # open(FH, ">$thumbnail");
    # print FH $thumbnail->jpeg();
    # close(FH);
    # Shows results of my continual failures
    print qq~$image<br />~;
    print qq~$new<br />~;
    print qq~$thumb<br />~;
    exit;
}

All I desire to find out with this question is how to resize an image, convert it to JPEG, then save it. Don't worry about all the other stuff I screwed up and all my ridiculous attempts. I thought maybe showing my attempts would help clarify my desired result.

I really appreciate all the help I get here.

Answers


CGI::ImageMagick does not work like you assume it does. You did not understand the documentation. You want to use Image::Magick proper, or just Image::Resize, or simply one of the ready-made thumbnailing modules. See below for working examples.

$savelocal is named inappropriately. getstore returns the response code. Besides you are not doing anything with this variable afterwards. You must include error checking.

Use File::LibMagic to determine file types of local files. Doing it the wrong way (file name extensions) takes more effort and lines of code. This even is not at all necessary; since you are fetching the image over HTTP, trust its Content-Type header. In the example, I skip this since the module supports image format autodetection.

split /./ does not do what you think it does.


# working on a local file
use Image::Thumbnail;
my $t = Image::Thumbnail->new(
    size       => 120,
    input      => '6226701.bmp',
    outputpath => '6226701-thumbnail.jpg',
);
$t->create or die "Could not create thumbnail - error: $t->{error} - warning: $t->{warning}\n";

# fetching an image, then working on it without explicitely saving it first locally
use Image::Thumbnail;
use LWP::UserAgent;
my $image_name = '6226701.bmp';
my $response = LWP::UserAgent->new->get('http://someremotedomain.example.com/' . $image_name);
die "Could not fetching image: $response->status_line\n" unless $response->is_success;

my $t = Image::Thumbnail->new(
    size       => 120,
    input      => \$response->decoded_content, # scalar ref = in-memory access
    outputpath => "$image_name-thumbnail.jpg",
);
$t->create or die "Could not create thumbnail - error: $t->{error} - warning: $t->{warning}\n";

Need Your Help

how to create hexadecimal identity auto increment column sql server

sql sql-server sql-server-2008-r2

Can anyone tell me how to create an identity column with auto increment storing hexadecimal values in sql server 2008 r2?

Return control from controller's action with lambda in Rails

ruby-on-rails controller return dry proc

How can I fix this error? I want to DRY my controller, and in each method I perform a sanity check on params[], just making sure all params are present.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.