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 <[email protected]>
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
>
>