My question is how can you delete all the images but retain the
Graphics::Magick object? I do not want to use the undef loop above. With
normal perlmagick, you would say
  @$image = ();

It's still just Perl -- how you got the image object is irrelevant. It's
still a reference and you can operate on it as normal:

    my $image = $self->image;
    @$image = ();

However, I'm shocked that there isn't an API for this. Operating on the
reference directly is pretty gross.




On Mon, Jul 20, 2015 at 8:35 AM, Rick Leir <richard.l...@canadiana.ca>
wrote:

> Hi everyone,
>
> I have been working on a web service for GM PerlMagick, and Moo was
> suggested. The GM object is kept across requests, but the image memory is
> freed (question below). Here is what it looks like:
> package Something::Magick;
>
> use Graphics::Magick;
>
> use Dancer::Core::Types; # brings helper for types
> use MooX::Types::MooseLike::Base; # InstanceOf
> use MooX::Types::MooseLike;
>
> # Moo def must follow other defs.
> use Moo;
> with 'MooX::Singleton';
>
> has image => (
>     is => 'rw',
>     isa => InstanceOf['Graphics::Magick'],
>     lazy => 1,
>     builder => '_build_image'
> );
> # The lazy attribute says to Moo that this attribute will be built
> (initialized)
> # only when called the first time. It means that the connection to GmImage
> won't be opened until necessary.
>
> sub _build_image {
>     my ($self) = @_;
>     Graphics::Magick->new( );
> }
> sub BUILD {
>     my ($self) = @_;
>     $self->image( Graphics::Magick->new( ));
> }
>
> sub do_sequence {
>     my $self = shift;
>     my @seq = shift || 1;
>
>     my $Arrayofhashes = \$seq[0][0];
>     my $sizeminus1 = @$$Arrayofhashes - 1; #++++++++++++++ 3
>
>     for my $i ( 0 .. $sizeminus1 ) {
>         my $href = $seq[0][0][$i];
>
>         my $opname;
>         my $filepath;
>         my $gmparms;
>         while( my ($k, $v) = each %$href ) {
> .... sanitize input ..
>            if( $k eq 'op') {
>                 $opname = $v;
>             }
>             elsif( $k eq 'file') {
>                 $v =~ s/^\/+//;  # remove any leading /
>                 $filepath = $v;
>             }
>             elsif( $k eq 'parms') {
>                 $gmparms = $v;
>             }
>         }
> ..
>                if( $opname eq 'Read') {
>                     my $status = $self->image->Read( $absolute);
>                     warn "$status" if "$status";
>                 } elsif( $opname eq 'Write') {
>                     my $status = $self->image->Write( $absolute);
>                     warn "$status" if "$status";
>                 }
>   ...
>            # some op other than read,write
>                # invoke it
>                 my $status = $self->image->$opname( $gmparms);
>                 warn "$status" if "$status";
>             }
>
>     # delete all the images but retain the Graphics::Magick object
>     # @$image = ();  no
>     # @self->image = ();  no
>     # @{self->image} = ();  no
>
>     my $i = 0;
> #    while (defined ($self->image->[$i])) {
>     while ( $i < 10) {
>         if (defined ($self->image->[$i])) {
>             undef ($self->image->[$i]);
>             print "======== undef $i\n";
>         }
>         $i++;
>     }
> }
> My question is how can you delete all the images but retain the
> Graphics::Magick object? I do not want to use the undef loop above. With
> normal perlmagick, you would say
>   @$image = ();
> ( http://www.graphicsmagick.org/perl.html )
>
> Should I learn more about Perl XS?  TIA
> --
> Rick
>
>

Reply via email to