From 12392181b58a25b8f63410d10759457e070ad24e Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 7 Oct 2014 14:16:15 -0400 Subject: support output in different formats from input --- lib/Image/PNM.pm | 32 +++++++++++++++++++++++++++++--- t/P1.t | 28 ++++++++++++++++++++++++++++ t/P2.t | 27 +++++++++++++++++++++++++++ t/P3.t | 27 +++++++++++++++++++++++++++ 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'), <as_string('P3'), <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'), <as_string('P2'), <as_string('P3'), <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'), <as_string('P2'), <as_string('P3'), <