summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-10-07 16:51:57 -0400
committerJesse Luehrs <doy@tozt.net>2014-10-07 16:51:57 -0400
commited8e2b3f8b13f403f70bec487066bdd30c9a8cc8 (patch)
treeefea672506f8a9cdda526ac6dbf779b772f94d63 /lib
parent616b8e75b274c76a791960ae6343d9b3cc873d21 (diff)
downloadimage-pnm-ed8e2b3f8b13f403f70bec487066bdd30c9a8cc8.tar.gz
image-pnm-ed8e2b3f8b13f403f70bec487066bdd30c9a8cc8.zip
add support for modifying the image
Diffstat (limited to 'lib')
-rw-r--r--lib/Image/PNM.pm63
1 files changed, 54 insertions, 9 deletions
diff --git a/lib/Image/PNM.pm b/lib/Image/PNM.pm
index b089851..6239d23 100644
--- a/lib/Image/PNM.pm
+++ b/lib/Image/PNM.pm
@@ -69,25 +69,53 @@ sub as_string {
return $self->$method;
}
-=method width
+=method width($w)
-Returns the width of the image in pixels.
+Returns the width of the image in pixels. If C<$w> is given, sets the width of
+the image to C<$w>.
=cut
sub width {
my $self = shift;
+ my ($w) = @_;
+ if (defined($w)) {
+ for my $row (@{ $self->{pixels} }) {
+ if ($w > $self->{w}) {
+ push @$row, 0
+ for 1..($w - $self->{w});
+ }
+ else {
+ pop @$row
+ for 1..($self->{w} - $w);
+ }
+ }
+ $self->{w} = $w;
+ }
return $self->{w};
}
-=method height
+=method height($h)
-Returns the height of the image in pixels.
+Returns the height of the image in pixels. If C<$h> is given, sets the height
+of the image to C<$h>.
=cut
sub height {
my $self = shift;
+ my ($h) = @_;
+ if (defined($h)) {
+ if ($h > $self->{h}) {
+ push @{ $self->{pixels} }, [ (0) x $self->{w} ]
+ for 1..($h - $self->{h});
+ }
+ else {
+ pop @{ $self->{pixels} }
+ for 1..($self->{h} - $h);
+ }
+ $self->{h} = $h;
+ }
return $self->{h};
}
@@ -100,10 +128,17 @@ and they are interpreted as being scaled by this value.
sub max_pixel_value {
my $self = shift;
+ my ($max) = @_;
+ if (defined($max)) {
+ for my $row (@{ $self->{pixels} }) {
+ @$row = map { $_ * $self->{max} / $max } @$row;
+ }
+ $self->{max} = $max;
+ }
return $self->{max};
}
-=method pixel($row, $col)
+=method pixel($row, $col, $new_value)
Returns the value of a pixel at the given C<$row> and C<$col>. The value is
returned as an arrayref of three RGB values, where each value ranges from
@@ -113,13 +148,18 @@ C<0.0> to C<1.0>.
sub pixel {
my $self = shift;
- my ($row, $col) = @_;
+ my ($row, $col, $new_value) = @_;
- my $pixel = $self->raw_pixel($row, $col);
+ if (defined($new_value)) {
+ $new_value = ref($new_value)
+ ? [ map { $_ * $self->{max} } @$new_value ]
+ : $new_value * $self->{max};
+ }
+ my $pixel = $self->raw_pixel($row, $col, $new_value);
return [ map { $_ / $self->{max} } @$pixel ];
}
-=method raw_pixel($row, $col)
+=method raw_pixel($row, $col, $new_value)
Returns the value of a pixel at the given C<$row> and C<$col>. The value is
returned as an arrayref of three RGB values, where each value is an integer
@@ -129,12 +169,17 @@ ranging from C<0> to C<< $image->max_pixel_value >>.
sub raw_pixel {
my $self = shift;
- my ($row, $col) = @_;
+ my ($row, $col, $new_value) = @_;
my $pixel = $self->{pixels}[$row][$col];
die "invalid pixel location ($row, $col)"
unless defined $pixel;
+ if (defined($new_value)) {
+ $self->{pixels}[$row][$col] = $new_value;
+ $pixel = $new_value;
+ }
+
if (!ref $pixel) {
$pixel = [ $pixel, $pixel, $pixel ];
}