summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-10-07 14:16:15 -0400
committerJesse Luehrs <doy@tozt.net>2014-10-07 14:56:01 -0400
commit12392181b58a25b8f63410d10759457e070ad24e (patch)
treee8424be87489c0a50adebe814cc77063b80e8696
parentc2372470164611b5597ea63faf8dcfe33381df39 (diff)
downloadimage-pnm-12392181b58a25b8f63410d10759457e070ad24e.tar.gz
image-pnm-12392181b58a25b8f63410d10759457e070ad24e.zip
support output in different formats from input
-rw-r--r--lib/Image/PNM.pm32
-rw-r--r--t/P1.t28
-rw-r--r--t/P2.t27
-rw-r--r--t/P3.t27
4 files changed, 111 insertions, 3 deletions
diff --git a/lib/Image/PNM.pm b/lib/Image/PNM.pm
index 5a97439..5136220 100644
--- a/lib/Image/PNM.pm
+++ b/lib/Image/PNM.pm
@@ -82,7 +82,16 @@ $self->{w} $self->{h}
HEADER
for my $row (@{ $self->{pixels} }) {
- $data .= join(' ', map { $_ ? '0' : '1' } @$row) . "\n";
+ $data .= join(' ', map {
+ my $val;
+ if (ref($_)) {
+ $val = $self->_to_greyscale(@$_);
+ }
+ else {
+ $val = $_;
+ }
+ $val * 2 > $self->{max} ? '0' : '1'
+ } @$row) . "\n";
}
return $data;
@@ -98,7 +107,14 @@ $self->{max}
HEADER
for my $row (@{ $self->{pixels} }) {
- $data .= join(' ', @$row) . "\n";
+ $data .= join(' ', map {
+ if (ref($_)) {
+ $self->_to_greyscale(@$_)
+ }
+ else {
+ $_
+ }
+ } @$row) . "\n";
}
return $data;
@@ -114,7 +130,9 @@ $self->{max}
HEADER
for my $row (@{ $self->{pixels} }) {
- $data .= join(' ', map { join(' ', @$_) } @$row) . "\n";
+ $data .= join(' ', map {
+ ref($_) ? join(' ', @$_) : "$_ $_ $_"
+ } @$row) . "\n";
}
return $data;
@@ -259,4 +277,12 @@ sub _make_next_word {
};
}
+sub _to_greyscale {
+ my $self = shift;
+ my ($r, $g, $b) = @_;
+ # luma calculation
+ # https://en.wikipedia.org/wiki/YUV
+ int(0.2126*$r + 0.7152*$g + 0.0722*$b + 0.5)
+}
+
1;
diff --git a/t/P1.t b/t/P1.t
index 3fbfb04..9e0bf14 100644
--- a/t/P1.t
+++ b/t/P1.t
@@ -26,4 +26,32 @@ P1
0 0 0 0 0 0
IMAGE
+is($image->as_string('P2'), <<IMAGE);
+P2
+6 8
+1
+1 1 1 1 1 1
+1 1 0 0 1 1
+1 0 1 1 0 1
+0 1 1 1 1 0
+0 0 0 0 0 0
+0 1 1 1 1 0
+0 1 1 1 1 0
+1 1 1 1 1 1
+IMAGE
+
+is($image->as_string('P3'), <<IMAGE);
+P3
+6 8
+1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1
+1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1
+0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+IMAGE
+
done_testing;
diff --git a/t/P2.t b/t/P2.t
index 41c2d8e..e7b7fdc 100644
--- a/t/P2.t
+++ b/t/P2.t
@@ -13,6 +13,19 @@ is($image->max_pixel_value, 255);
is_deeply($image->raw_pixel(1, 2), [78, 78, 78]);
is_deeply($image->pixel(0, 0), [1, 1, 1]);
+is($image->as_string('P1'), <<IMAGE);
+P1
+6 8
+0 0 0 0 0 0
+0 0 1 1 0 0
+0 1 0 0 1 0
+1 0 0 0 0 1
+1 1 1 1 1 1
+1 0 0 0 0 1
+1 0 0 0 0 1
+0 0 0 0 0 0
+IMAGE
+
is($image->as_string('P2'), <<IMAGE);
P2
6 8
@@ -27,4 +40,18 @@ P2
255 255 255 255 255 255
IMAGE
+is($image->as_string('P3'), <<IMAGE);
+P3
+6 8
+255
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 78 78 78 78 78 78 255 255 255 255 255 255
+255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255
+0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0
+0 0 0 54 54 54 54 54 54 54 54 54 54 54 54 0 0 0
+0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0
+0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+IMAGE
+
done_testing;
diff --git a/t/P3.t b/t/P3.t
index 1b8e663..fd55b8d 100644
--- a/t/P3.t
+++ b/t/P3.t
@@ -13,6 +13,33 @@ is($image->max_pixel_value, 255);
is_deeply($image->raw_pixel(1, 2), [0, 84, 255]);
is_deeply($image->pixel(4, 1), [1, 0, 0]);
+is($image->as_string('P1'), <<IMAGE);
+P1
+6 8
+0 0 0 0 0 0
+0 0 1 1 0 0
+0 1 0 0 1 0
+1 0 0 0 0 1
+1 1 1 1 1 1
+1 0 0 0 0 1
+1 0 0 0 0 1
+0 0 0 0 0 0
+IMAGE
+
+is($image->as_string('P2'), <<IMAGE);
+P2
+6 8
+255
+255 255 255 255 255 255
+255 255 78 78 255 255
+255 0 255 255 0 255
+0 255 255 255 255 0
+0 54 54 54 54 0
+0 255 255 255 255 0
+0 255 255 255 255 0
+255 255 255 255 255 255
+IMAGE
+
is($image->as_string('P3'), <<IMAGE);
P3
6 8